@finos/legend-application-data-cube 0.2.4 → 0.2.6
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 +1 -1
- package/lib/__lib__/LegendDataCubeNavigation.d.ts +9 -5
- package/lib/__lib__/LegendDataCubeNavigation.d.ts.map +1 -1
- package/lib/__lib__/LegendDataCubeNavigation.js +9 -5
- package/lib/__lib__/LegendDataCubeNavigation.js.map +1 -1
- package/lib/__lib__/LegendDataCubeUserData.d.ts +2 -2
- package/lib/__lib__/LegendDataCubeUserData.d.ts.map +1 -1
- package/lib/__lib__/LegendDataCubeUserData.js +2 -2
- package/lib/__lib__/LegendDataCubeUserData.js.map +1 -1
- package/lib/application/LegendDataCubeApplicationConfig.d.ts +4 -0
- package/lib/application/LegendDataCubeApplicationConfig.d.ts.map +1 -1
- package/lib/application/LegendDataCubeApplicationConfig.js +5 -0
- package/lib/application/LegendDataCubeApplicationConfig.js.map +1 -1
- package/lib/components/LegendDataCubeBlockingWindow.d.ts +29 -0
- package/lib/components/LegendDataCubeBlockingWindow.d.ts.map +1 -0
- package/lib/components/LegendDataCubeBlockingWindow.js +75 -0
- package/lib/components/LegendDataCubeBlockingWindow.js.map +1 -0
- package/lib/components/LegendDataCubeWebApplication.js +2 -2
- package/lib/components/LegendDataCubeWebApplication.js.map +1 -1
- package/lib/components/builder/LegendDataCubeBuilder.d.ts +20 -0
- package/lib/components/builder/LegendDataCubeBuilder.d.ts.map +1 -0
- package/lib/components/builder/LegendDataCubeBuilder.js +162 -0
- package/lib/components/builder/LegendDataCubeBuilder.js.map +1 -0
- package/lib/components/builder/LegendDataCubeBuilderStoreProvider.d.ts +19 -0
- package/lib/components/builder/LegendDataCubeBuilderStoreProvider.d.ts.map +1 -0
- package/lib/components/builder/LegendDataCubeBuilderStoreProvider.js +34 -0
- package/lib/components/builder/LegendDataCubeBuilderStoreProvider.js.map +1 -0
- package/lib/components/{query-builder/LegendDataCubeQuerySaver.d.ts → builder/LegendDataCubeCreator.d.ts} +2 -2
- package/lib/components/builder/LegendDataCubeCreator.d.ts.map +1 -0
- package/lib/components/{query-builder/LegendDataCubeNewQueryBuilder.js → builder/LegendDataCubeCreator.js} +10 -10
- package/lib/components/builder/LegendDataCubeCreator.js.map +1 -0
- package/lib/components/builder/LegendDataCubeDeleteConfirmation.d.ts +19 -0
- package/lib/components/builder/LegendDataCubeDeleteConfirmation.d.ts.map +1 -0
- package/lib/components/builder/LegendDataCubeDeleteConfirmation.js +43 -0
- package/lib/components/builder/LegendDataCubeDeleteConfirmation.js.map +1 -0
- package/lib/components/{query-builder/LegendDataCubeQueryLoader.d.ts → builder/LegendDataCubeLoader.d.ts} +2 -2
- package/lib/components/builder/LegendDataCubeLoader.d.ts.map +1 -0
- package/lib/components/builder/LegendDataCubeLoader.js +113 -0
- package/lib/components/builder/LegendDataCubeLoader.js.map +1 -0
- package/lib/components/{query-builder/LegendDataCubeNewQueryBuilder.d.ts → builder/LegendDataCubeSaver.d.ts} +2 -2
- package/lib/components/builder/LegendDataCubeSaver.d.ts.map +1 -0
- package/lib/components/builder/LegendDataCubeSaver.js +73 -0
- package/lib/components/builder/LegendDataCubeSaver.js.map +1 -0
- package/lib/components/{query-builder/LegendDataCubeQueryBuilder.d.ts → builder/LegendDataCubeSourceViewer.d.ts} +4 -2
- package/lib/components/builder/LegendDataCubeSourceViewer.d.ts.map +1 -0
- package/lib/components/builder/LegendDataCubeSourceViewer.js +46 -0
- package/lib/components/builder/LegendDataCubeSourceViewer.js.map +1 -0
- package/lib/components/{query-builder/source-builder → builder/source}/AdhocQueryDataCubeSourceBuilder.d.ts +1 -1
- package/lib/components/builder/source/AdhocQueryDataCubeSourceBuilder.d.ts.map +1 -0
- package/lib/components/builder/source/AdhocQueryDataCubeSourceBuilder.js.map +1 -0
- package/lib/components/{query-builder/source-builder → builder/source}/LegendQueryDataCubeSourceBuilder.d.ts +1 -1
- package/lib/components/builder/source/LegendQueryDataCubeSourceBuilder.d.ts.map +1 -0
- package/lib/components/{query-builder/source-builder → builder/source}/LegendQueryDataCubeSourceBuilder.js +13 -13
- package/lib/components/builder/source/LegendQueryDataCubeSourceBuilder.js.map +1 -0
- package/lib/index.css +1 -1
- package/lib/package.json +1 -1
- package/lib/stores/LegendDataCubeCacheManager.d.ts.map +1 -1
- package/lib/stores/LegendDataCubeCacheManager.js +11 -12
- package/lib/stores/LegendDataCubeCacheManager.js.map +1 -1
- package/lib/stores/LegendDataCubeDataCubeEngine.d.ts +1 -1
- package/lib/stores/LegendDataCubeDataCubeEngine.d.ts.map +1 -1
- package/lib/stores/LegendDataCubeDataCubeEngine.js +5 -11
- package/lib/stores/LegendDataCubeDataCubeEngine.js.map +1 -1
- package/lib/stores/builder/LegendDataCubeBuilderStore.d.ts +80 -0
- package/lib/stores/builder/LegendDataCubeBuilderStore.d.ts.map +1 -0
- package/lib/stores/builder/LegendDataCubeBuilderStore.js +353 -0
- package/lib/stores/builder/LegendDataCubeBuilderStore.js.map +1 -0
- package/lib/stores/{query-builder/LegendDataCubeNewQueryState.d.ts → builder/LegendDataCubeCreatorState.d.ts} +5 -5
- package/lib/stores/builder/LegendDataCubeCreatorState.d.ts.map +1 -0
- package/lib/stores/{query-builder/LegendDataCubeNewQueryState.js → builder/LegendDataCubeCreatorState.js} +17 -17
- package/lib/stores/builder/LegendDataCubeCreatorState.js.map +1 -0
- package/lib/stores/{query-builder/LegendDataCubeQueryLoaderState.d.ts → builder/LegendDataCubeLoaderState.d.ts} +20 -20
- package/lib/stores/builder/LegendDataCubeLoaderState.d.ts.map +1 -0
- package/lib/stores/builder/LegendDataCubeLoaderState.js +187 -0
- package/lib/stores/builder/LegendDataCubeLoaderState.js.map +1 -0
- package/lib/stores/builder/source/AdhocQueryDataCubeSourceBuilderState.d.ts.map +1 -0
- package/lib/stores/builder/source/AdhocQueryDataCubeSourceBuilderState.js.map +1 -0
- package/lib/stores/builder/source/LegendDataCubeSourceBuilderState.d.ts.map +1 -0
- package/lib/stores/{query-builder/source-builder → builder/source}/LegendDataCubeSourceBuilderState.js +1 -1
- package/lib/stores/builder/source/LegendDataCubeSourceBuilderState.js.map +1 -0
- package/lib/stores/builder/source/LegendQueryDataCubeSourceBuilderState.d.ts.map +1 -0
- package/lib/stores/builder/source/LegendQueryDataCubeSourceBuilderState.js.map +1 -0
- package/package.json +5 -5
- package/src/__lib__/LegendDataCubeNavigation.ts +15 -7
- package/src/__lib__/LegendDataCubeUserData.ts +2 -2
- package/src/application/LegendDataCubeApplicationConfig.ts +12 -0
- package/src/components/LegendDataCubeBlockingWindow.tsx +120 -0
- package/src/components/LegendDataCubeWebApplication.tsx +3 -3
- package/src/components/builder/LegendDataCubeBuilder.tsx +331 -0
- package/src/components/{query-builder/LegendDataCubeQueryBuilderStoreProvider.tsx → builder/LegendDataCubeBuilderStoreProvider.tsx} +19 -16
- package/src/components/{query-builder/LegendDataCubeNewQueryBuilder.tsx → builder/LegendDataCubeCreator.tsx} +9 -9
- package/src/components/builder/LegendDataCubeDeleteConfirmation.tsx +87 -0
- package/src/components/{query-builder/LegendDataCubeQueryLoader.tsx → builder/LegendDataCubeLoader.tsx} +122 -59
- package/src/components/builder/LegendDataCubeSaver.tsx +184 -0
- package/src/components/builder/LegendDataCubeSourceViewer.tsx +108 -0
- package/src/components/{query-builder/source-builder → builder/source}/AdhocQueryDataCubeSourceBuilder.tsx +1 -1
- package/src/components/{query-builder/source-builder → builder/source}/LegendQueryDataCubeSourceBuilder.tsx +16 -15
- package/src/stores/LegendDataCubeCacheManager.ts +11 -12
- package/src/stores/LegendDataCubeDataCubeEngine.ts +4 -14
- package/src/stores/builder/LegendDataCubeBuilderStore.tsx +516 -0
- package/src/stores/{query-builder/LegendDataCubeNewQueryState.tsx → builder/LegendDataCubeCreatorState.tsx} +23 -21
- package/src/stores/builder/LegendDataCubeLoaderState.tsx +248 -0
- package/src/stores/{query-builder/source-builder → builder/source}/LegendDataCubeSourceBuilderState.ts +1 -1
- package/tsconfig.json +16 -13
- package/lib/components/query-builder/LegendDataCubeNewQueryBuilder.d.ts.map +0 -1
- package/lib/components/query-builder/LegendDataCubeNewQueryBuilder.js.map +0 -1
- package/lib/components/query-builder/LegendDataCubeQueryBuilder.d.ts.map +0 -1
- package/lib/components/query-builder/LegendDataCubeQueryBuilder.js +0 -93
- package/lib/components/query-builder/LegendDataCubeQueryBuilder.js.map +0 -1
- package/lib/components/query-builder/LegendDataCubeQueryBuilderStoreProvider.d.ts +0 -19
- package/lib/components/query-builder/LegendDataCubeQueryBuilderStoreProvider.d.ts.map +0 -1
- package/lib/components/query-builder/LegendDataCubeQueryBuilderStoreProvider.js +0 -33
- package/lib/components/query-builder/LegendDataCubeQueryBuilderStoreProvider.js.map +0 -1
- package/lib/components/query-builder/LegendDataCubeQueryLoader.d.ts.map +0 -1
- package/lib/components/query-builder/LegendDataCubeQueryLoader.js +0 -97
- package/lib/components/query-builder/LegendDataCubeQueryLoader.js.map +0 -1
- package/lib/components/query-builder/LegendDataCubeQuerySaver.d.ts.map +0 -1
- package/lib/components/query-builder/LegendDataCubeQuerySaver.js +0 -51
- package/lib/components/query-builder/LegendDataCubeQuerySaver.js.map +0 -1
- package/lib/components/query-builder/source-builder/AdhocQueryDataCubeSourceBuilder.d.ts.map +0 -1
- package/lib/components/query-builder/source-builder/AdhocQueryDataCubeSourceBuilder.js.map +0 -1
- package/lib/components/query-builder/source-builder/LegendQueryDataCubeSourceBuilder.d.ts.map +0 -1
- package/lib/components/query-builder/source-builder/LegendQueryDataCubeSourceBuilder.js.map +0 -1
- package/lib/stores/query-builder/LegendDataCubeNewQueryState.d.ts.map +0 -1
- package/lib/stores/query-builder/LegendDataCubeNewQueryState.js.map +0 -1
- package/lib/stores/query-builder/LegendDataCubeQueryBuilderStore.d.ts +0 -58
- package/lib/stores/query-builder/LegendDataCubeQueryBuilderStore.d.ts.map +0 -1
- package/lib/stores/query-builder/LegendDataCubeQueryBuilderStore.js +0 -228
- package/lib/stores/query-builder/LegendDataCubeQueryBuilderStore.js.map +0 -1
- package/lib/stores/query-builder/LegendDataCubeQueryLoaderState.d.ts.map +0 -1
- package/lib/stores/query-builder/LegendDataCubeQueryLoaderState.js +0 -198
- package/lib/stores/query-builder/LegendDataCubeQueryLoaderState.js.map +0 -1
- package/lib/stores/query-builder/source-builder/AdhocQueryDataCubeSourceBuilderState.d.ts.map +0 -1
- package/lib/stores/query-builder/source-builder/AdhocQueryDataCubeSourceBuilderState.js.map +0 -1
- package/lib/stores/query-builder/source-builder/LegendDataCubeSourceBuilderState.d.ts.map +0 -1
- package/lib/stores/query-builder/source-builder/LegendDataCubeSourceBuilderState.js.map +0 -1
- package/lib/stores/query-builder/source-builder/LegendQueryDataCubeSourceBuilderState.d.ts.map +0 -1
- package/lib/stores/query-builder/source-builder/LegendQueryDataCubeSourceBuilderState.js.map +0 -1
- package/src/components/query-builder/LegendDataCubeQueryBuilder.tsx +0 -164
- package/src/components/query-builder/LegendDataCubeQuerySaver.tsx +0 -116
- package/src/stores/query-builder/LegendDataCubeQueryBuilderStore.tsx +0 -323
- package/src/stores/query-builder/LegendDataCubeQueryLoaderState.tsx +0 -260
- /package/lib/components/{query-builder/source-builder → builder/source}/AdhocQueryDataCubeSourceBuilder.js +0 -0
- /package/lib/stores/{query-builder/source-builder → builder/source}/AdhocQueryDataCubeSourceBuilderState.d.ts +0 -0
- /package/lib/stores/{query-builder/source-builder → builder/source}/AdhocQueryDataCubeSourceBuilderState.js +0 -0
- /package/lib/stores/{query-builder/source-builder → builder/source}/LegendDataCubeSourceBuilderState.d.ts +0 -0
- /package/lib/stores/{query-builder/source-builder → builder/source}/LegendQueryDataCubeSourceBuilderState.d.ts +0 -0
- /package/lib/stores/{query-builder/source-builder → builder/source}/LegendQueryDataCubeSourceBuilderState.js +0 -0
- /package/src/stores/{query-builder/source-builder → builder/source}/AdhocQueryDataCubeSourceBuilderState.ts +0 -0
- /package/src/stores/{query-builder/source-builder → builder/source}/LegendQueryDataCubeSourceBuilderState.ts +0 -0
|
@@ -0,0 +1,516 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2020-present, Goldman Sachs
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { action, makeObservable, observable } from 'mobx';
|
|
18
|
+
import type {
|
|
19
|
+
LegendDataCubeApplicationStore,
|
|
20
|
+
LegendDataCubeBaseStore,
|
|
21
|
+
} from '../LegendDataCubeBaseStore.js';
|
|
22
|
+
import {
|
|
23
|
+
type DataCubeAlertService,
|
|
24
|
+
type DataCubeAPI,
|
|
25
|
+
type DataCubeLayoutService,
|
|
26
|
+
type DataCubeTaskService,
|
|
27
|
+
DataCubeSpecification,
|
|
28
|
+
DEFAULT_ALERT_WINDOW_CONFIG,
|
|
29
|
+
type DisplayState,
|
|
30
|
+
DataCubeSpecificationOptions,
|
|
31
|
+
type DataCubeSource,
|
|
32
|
+
} from '@finos/legend-data-cube';
|
|
33
|
+
import { LegendDataCubeCreatorState } from './LegendDataCubeCreatorState.js';
|
|
34
|
+
import {
|
|
35
|
+
PersistentDataCube,
|
|
36
|
+
type LightPersistentDataCube,
|
|
37
|
+
type V1_EngineServerClient,
|
|
38
|
+
type V1_PureGraphManager,
|
|
39
|
+
} from '@finos/legend-graph';
|
|
40
|
+
import {
|
|
41
|
+
ActionState,
|
|
42
|
+
assertErrorThrown,
|
|
43
|
+
formatDate,
|
|
44
|
+
isString,
|
|
45
|
+
uuid,
|
|
46
|
+
} from '@finos/legend-shared';
|
|
47
|
+
import type { LegendDataCubeDataCubeEngine } from '../LegendDataCubeDataCubeEngine.js';
|
|
48
|
+
import { LegendDataCubeSaver } from '../../components/builder/LegendDataCubeSaver.js';
|
|
49
|
+
import {
|
|
50
|
+
generateBuilderRoute,
|
|
51
|
+
LEGEND_DATA_CUBE_ROUTE_PATTERN_TOKEN,
|
|
52
|
+
} from '../../__lib__/LegendDataCubeNavigation.js';
|
|
53
|
+
import { LegendDataCubeLoaderState } from './LegendDataCubeLoaderState.js';
|
|
54
|
+
import {
|
|
55
|
+
LegendDataCubeUserDataKey,
|
|
56
|
+
RECENTLY_VIEWED_DATA_CUBES_LIMIT,
|
|
57
|
+
} from '../../__lib__/LegendDataCubeUserData.js';
|
|
58
|
+
import type { DepotServerClient } from '@finos/legend-server-depot';
|
|
59
|
+
import { LegendDataCubeBlockingWindowState } from '../../components/LegendDataCubeBlockingWindow.js';
|
|
60
|
+
import { LegendDataCubeDeleteConfirmation } from '../../components/builder/LegendDataCubeDeleteConfirmation.js';
|
|
61
|
+
import { LegendDataCubeAbout } from '../../components/builder/LegendDataCubeBuilder.js';
|
|
62
|
+
import { LegendDataCubeSourceViewer } from '../../components/builder/LegendDataCubeSourceViewer.js';
|
|
63
|
+
|
|
64
|
+
export class LegendDataCubeBuilderState {
|
|
65
|
+
readonly uuid = uuid();
|
|
66
|
+
readonly startTime = Date.now();
|
|
67
|
+
|
|
68
|
+
readonly initialSpecification!: DataCubeSpecification;
|
|
69
|
+
persistentDataCube?: PersistentDataCube | undefined;
|
|
70
|
+
|
|
71
|
+
dataCube?: DataCubeAPI | undefined;
|
|
72
|
+
source?: DataCubeSource | undefined;
|
|
73
|
+
|
|
74
|
+
constructor(
|
|
75
|
+
specification: DataCubeSpecification,
|
|
76
|
+
persistentDataCube?: PersistentDataCube | undefined,
|
|
77
|
+
) {
|
|
78
|
+
makeObservable(this, {
|
|
79
|
+
persistentDataCube: observable,
|
|
80
|
+
setPersistentDataCube: action,
|
|
81
|
+
|
|
82
|
+
dataCube: observable,
|
|
83
|
+
setDataCube: action,
|
|
84
|
+
|
|
85
|
+
source: observable,
|
|
86
|
+
setSource: action,
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
this.initialSpecification = specification;
|
|
90
|
+
this.persistentDataCube = persistentDataCube;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
setPersistentDataCube(val: PersistentDataCube | undefined) {
|
|
94
|
+
this.persistentDataCube = val;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
setDataCube(val: DataCubeAPI | undefined) {
|
|
98
|
+
this.dataCube = val;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
setSource(val: DataCubeSource | undefined) {
|
|
102
|
+
this.source = val;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export type LegendDataCubeSaveOptions = {
|
|
107
|
+
syncName?: boolean | undefined;
|
|
108
|
+
autoEnableCache?: boolean | undefined;
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
export class LegendDataCubeBuilderStore {
|
|
112
|
+
readonly application: LegendDataCubeApplicationStore;
|
|
113
|
+
readonly baseStore: LegendDataCubeBaseStore;
|
|
114
|
+
readonly engine: LegendDataCubeDataCubeEngine;
|
|
115
|
+
readonly depotServerClient: DepotServerClient;
|
|
116
|
+
readonly engineServerClient: V1_EngineServerClient;
|
|
117
|
+
readonly graphManager: V1_PureGraphManager;
|
|
118
|
+
readonly taskService: DataCubeTaskService;
|
|
119
|
+
readonly layoutService: DataCubeLayoutService;
|
|
120
|
+
readonly alertService: DataCubeAlertService;
|
|
121
|
+
|
|
122
|
+
readonly initializeState = ActionState.create();
|
|
123
|
+
readonly aboutDisplay: DisplayState;
|
|
124
|
+
|
|
125
|
+
readonly creator: LegendDataCubeCreatorState;
|
|
126
|
+
|
|
127
|
+
readonly saveState = ActionState.create();
|
|
128
|
+
readonly saverDisplay: LegendDataCubeBlockingWindowState;
|
|
129
|
+
|
|
130
|
+
readonly deleteState = ActionState.create();
|
|
131
|
+
dataCubeToDelete?: LightPersistentDataCube | PersistentDataCube | undefined;
|
|
132
|
+
readonly deleteConfirmationDisplay: LegendDataCubeBlockingWindowState;
|
|
133
|
+
|
|
134
|
+
readonly loadState = ActionState.create();
|
|
135
|
+
readonly loader: LegendDataCubeLoaderState;
|
|
136
|
+
builder?: LegendDataCubeBuilderState | undefined;
|
|
137
|
+
readonly sourceViewerDisplay: DisplayState;
|
|
138
|
+
|
|
139
|
+
private passedFirstLoad = false;
|
|
140
|
+
|
|
141
|
+
constructor(baseStore: LegendDataCubeBaseStore) {
|
|
142
|
+
makeObservable(this, {
|
|
143
|
+
builder: observable,
|
|
144
|
+
setBuilder: action,
|
|
145
|
+
|
|
146
|
+
dataCubeToDelete: observable,
|
|
147
|
+
setDataCubeToDelete: action,
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
this.application = baseStore.application;
|
|
151
|
+
this.baseStore = baseStore;
|
|
152
|
+
this.engine = baseStore.engine;
|
|
153
|
+
this.depotServerClient = baseStore.depotServerClient;
|
|
154
|
+
this.engineServerClient = baseStore.engineServerClient;
|
|
155
|
+
this.graphManager = baseStore.graphManager;
|
|
156
|
+
this.taskService = baseStore.taskService;
|
|
157
|
+
this.alertService = baseStore.alertService;
|
|
158
|
+
this.layoutService = baseStore.layoutService;
|
|
159
|
+
|
|
160
|
+
this.aboutDisplay = this.layoutService.newDisplay(
|
|
161
|
+
'About',
|
|
162
|
+
() => <LegendDataCubeAbout />,
|
|
163
|
+
{
|
|
164
|
+
...DEFAULT_ALERT_WINDOW_CONFIG,
|
|
165
|
+
height: 220,
|
|
166
|
+
x: -50,
|
|
167
|
+
y: 50,
|
|
168
|
+
center: false,
|
|
169
|
+
},
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
this.creator = new LegendDataCubeCreatorState(this);
|
|
173
|
+
this.loader = new LegendDataCubeLoaderState(this);
|
|
174
|
+
this.saverDisplay = new LegendDataCubeBlockingWindowState(
|
|
175
|
+
'Save DataCube',
|
|
176
|
+
() => <LegendDataCubeSaver />,
|
|
177
|
+
{
|
|
178
|
+
...DEFAULT_ALERT_WINDOW_CONFIG,
|
|
179
|
+
height: 200,
|
|
180
|
+
},
|
|
181
|
+
);
|
|
182
|
+
this.deleteConfirmationDisplay = new LegendDataCubeBlockingWindowState(
|
|
183
|
+
'Delete DataCube',
|
|
184
|
+
() => <LegendDataCubeDeleteConfirmation />,
|
|
185
|
+
{
|
|
186
|
+
...DEFAULT_ALERT_WINDOW_CONFIG,
|
|
187
|
+
height: 180,
|
|
188
|
+
},
|
|
189
|
+
);
|
|
190
|
+
this.sourceViewerDisplay = this.layoutService.newDisplay(
|
|
191
|
+
'DataCube Source',
|
|
192
|
+
() => <LegendDataCubeSourceViewer />,
|
|
193
|
+
{
|
|
194
|
+
...DEFAULT_ALERT_WINDOW_CONFIG,
|
|
195
|
+
height: 200,
|
|
196
|
+
},
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
setBuilder(val: LegendDataCubeBuilderState | undefined) {
|
|
201
|
+
this.builder = val;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
private updateWindowTitle(persistentDataCube: PersistentDataCube) {
|
|
205
|
+
this.application.layoutService.setWindowTitle(
|
|
206
|
+
`\u229E ${persistentDataCube.name}${this.builder ? ` - ${formatDate(new Date(this.builder.startTime), 'HH:mm:ss EEE MMM dd yyyy')}` : ''}`,
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
getRecentlyViewedDataCubes() {
|
|
211
|
+
const data = this.application.userDataService.getObjectValue(
|
|
212
|
+
LegendDataCubeUserDataKey.RECENTLY_VIEWED_DATA_CUBES,
|
|
213
|
+
);
|
|
214
|
+
return data && Array.isArray(data) && data.every((id) => isString(id))
|
|
215
|
+
? data
|
|
216
|
+
: [];
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
canCurrentUserManageDataCube(
|
|
220
|
+
persistentDataCube: PersistentDataCube | LightPersistentDataCube,
|
|
221
|
+
) {
|
|
222
|
+
return (
|
|
223
|
+
persistentDataCube.owner === this.application.identityService.currentUser
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
async initialize() {
|
|
228
|
+
if (this.initializeState.isInProgress) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
this.initializeState.inProgress();
|
|
233
|
+
try {
|
|
234
|
+
await this.engine.initializeCacheManager();
|
|
235
|
+
this.initializeState.pass();
|
|
236
|
+
} catch (error) {
|
|
237
|
+
assertErrorThrown(error);
|
|
238
|
+
this.alertService.alertError(error, {
|
|
239
|
+
message: `Infrastructure Failure: ${error.message}`,
|
|
240
|
+
});
|
|
241
|
+
this.initializeState.fail();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
async cleanUp() {
|
|
246
|
+
try {
|
|
247
|
+
await this.engine.disposeCacheManager();
|
|
248
|
+
} catch (error) {
|
|
249
|
+
assertErrorThrown(error);
|
|
250
|
+
this.alertService.alertError(error, {
|
|
251
|
+
message: `Infrastructure Failure: ${error.message}`,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
async loadDataCube(dataCubeId: string | undefined) {
|
|
257
|
+
// internalize the parameters and clean them from the URL
|
|
258
|
+
const sourceData =
|
|
259
|
+
this.application.navigationService.navigator.getCurrentLocationParameterValue(
|
|
260
|
+
LEGEND_DATA_CUBE_ROUTE_PATTERN_TOKEN.SOURCE_DATA,
|
|
261
|
+
);
|
|
262
|
+
if (sourceData && !dataCubeId) {
|
|
263
|
+
this.application.navigationService.navigator.updateCurrentLocation(
|
|
264
|
+
generateBuilderRoute(null),
|
|
265
|
+
);
|
|
266
|
+
// populate the creator if source data is specified
|
|
267
|
+
try {
|
|
268
|
+
await this.creator.finalize(JSON.parse(atob(sourceData)));
|
|
269
|
+
} catch (error) {
|
|
270
|
+
assertErrorThrown(error);
|
|
271
|
+
this.alertService.alertError(error, {
|
|
272
|
+
message: `DataCube Creation Failure: Can't materialize source from source data. Error: ${error.message}`,
|
|
273
|
+
});
|
|
274
|
+
this.setBuilder(undefined);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// When user just starts the application with no DataCube ID, and source data
|
|
279
|
+
if (!dataCubeId && !sourceData && !this.builder && !this.passedFirstLoad) {
|
|
280
|
+
this.loader.display.open();
|
|
281
|
+
}
|
|
282
|
+
this.passedFirstLoad = true;
|
|
283
|
+
|
|
284
|
+
if (dataCubeId !== this.builder?.persistentDataCube?.id) {
|
|
285
|
+
if (!dataCubeId) {
|
|
286
|
+
this.setBuilder(undefined);
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
this.loadState.inProgress();
|
|
291
|
+
|
|
292
|
+
try {
|
|
293
|
+
const persistentDataCube =
|
|
294
|
+
await this.baseStore.graphManager.getDataCube(dataCubeId);
|
|
295
|
+
const specification = DataCubeSpecification.serialization.fromJson(
|
|
296
|
+
persistentDataCube.content,
|
|
297
|
+
);
|
|
298
|
+
this.setBuilder(
|
|
299
|
+
new LegendDataCubeBuilderState(specification, persistentDataCube),
|
|
300
|
+
);
|
|
301
|
+
this.updateWindowTitle(persistentDataCube);
|
|
302
|
+
|
|
303
|
+
// update the list of stack of recently viewed DataCubes
|
|
304
|
+
const recentlyViewedDataCubes = this.getRecentlyViewedDataCubes();
|
|
305
|
+
const idx = recentlyViewedDataCubes.findIndex(
|
|
306
|
+
(data) => data === dataCubeId,
|
|
307
|
+
);
|
|
308
|
+
if (idx === -1) {
|
|
309
|
+
if (
|
|
310
|
+
recentlyViewedDataCubes.length >= RECENTLY_VIEWED_DATA_CUBES_LIMIT
|
|
311
|
+
) {
|
|
312
|
+
recentlyViewedDataCubes.pop();
|
|
313
|
+
}
|
|
314
|
+
recentlyViewedDataCubes.unshift(dataCubeId);
|
|
315
|
+
} else {
|
|
316
|
+
recentlyViewedDataCubes.splice(idx, 1);
|
|
317
|
+
recentlyViewedDataCubes.unshift(dataCubeId);
|
|
318
|
+
}
|
|
319
|
+
this.application.userDataService.persistValue(
|
|
320
|
+
LegendDataCubeUserDataKey.RECENTLY_VIEWED_DATA_CUBES,
|
|
321
|
+
recentlyViewedDataCubes,
|
|
322
|
+
);
|
|
323
|
+
|
|
324
|
+
this.loadState.pass();
|
|
325
|
+
} catch (error) {
|
|
326
|
+
assertErrorThrown(error);
|
|
327
|
+
this.alertService.alertError(error, {
|
|
328
|
+
message: `DataCube Load Failure: ${error.message}`,
|
|
329
|
+
});
|
|
330
|
+
this.application.navigationService.navigator.updateCurrentLocation(
|
|
331
|
+
generateBuilderRoute(null),
|
|
332
|
+
);
|
|
333
|
+
|
|
334
|
+
this.loadState.fail();
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
private async generatePersistentDataCube(
|
|
340
|
+
api: DataCubeAPI,
|
|
341
|
+
name: string,
|
|
342
|
+
existingPersistentDataCube?: PersistentDataCube | undefined,
|
|
343
|
+
options?: LegendDataCubeSaveOptions,
|
|
344
|
+
) {
|
|
345
|
+
const specification = await api.generateSpecification();
|
|
346
|
+
let persistentDataCube: PersistentDataCube;
|
|
347
|
+
if (existingPersistentDataCube) {
|
|
348
|
+
persistentDataCube = existingPersistentDataCube.clone();
|
|
349
|
+
} else {
|
|
350
|
+
persistentDataCube = new PersistentDataCube();
|
|
351
|
+
persistentDataCube.id = uuid();
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
if (options !== undefined) {
|
|
355
|
+
specification.options =
|
|
356
|
+
specification.options ?? new DataCubeSpecificationOptions();
|
|
357
|
+
specification.options.autoEnableCache = options.autoEnableCache;
|
|
358
|
+
|
|
359
|
+
if (options.syncName && specification.configuration) {
|
|
360
|
+
specification.configuration.name = name;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
persistentDataCube.name = name;
|
|
365
|
+
persistentDataCube.content =
|
|
366
|
+
DataCubeSpecification.serialization.toJson(specification);
|
|
367
|
+
return persistentDataCube;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
async createNewDataCube(name: string, options?: LegendDataCubeSaveOptions) {
|
|
371
|
+
if (!this.builder?.dataCube || this.saveState.isInProgress) {
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
this.saveState.inProgress();
|
|
376
|
+
try {
|
|
377
|
+
const persistentDataCube = await this.generatePersistentDataCube(
|
|
378
|
+
this.builder.dataCube,
|
|
379
|
+
name,
|
|
380
|
+
undefined,
|
|
381
|
+
options,
|
|
382
|
+
);
|
|
383
|
+
|
|
384
|
+
const newPersistentDataCube =
|
|
385
|
+
await this.baseStore.graphManager.createDataCube(persistentDataCube);
|
|
386
|
+
// NOTE: reload is the cleanest, least bug-prone handling here
|
|
387
|
+
// but we can opt for just updating the URL to reflect the new DataCube
|
|
388
|
+
// as an optimization. Also, it helps preserve the edition history
|
|
389
|
+
// on the existing data-cube.
|
|
390
|
+
//
|
|
391
|
+
// Another way to avoid reloading the whole app it to force update
|
|
392
|
+
// the <DataCube/> component using the key prop that ties to an ID
|
|
393
|
+
// of the builder.
|
|
394
|
+
this.application.navigationService.navigator.updateCurrentLocation(
|
|
395
|
+
generateBuilderRoute(newPersistentDataCube.id),
|
|
396
|
+
);
|
|
397
|
+
this.updateWindowTitle(persistentDataCube);
|
|
398
|
+
if (options?.syncName) {
|
|
399
|
+
this.builder.dataCube.updateName(name);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
this.saverDisplay.close();
|
|
403
|
+
this.saveState.pass();
|
|
404
|
+
} catch (error) {
|
|
405
|
+
assertErrorThrown(error);
|
|
406
|
+
this.alertService.alertError(error, {
|
|
407
|
+
message: `DataCube Creation Failure: ${error.message}`,
|
|
408
|
+
});
|
|
409
|
+
this.saveState.fail();
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
async saveDataCube(
|
|
414
|
+
name: string,
|
|
415
|
+
options?: LegendDataCubeSaveOptions & { saveAsNew?: boolean | undefined },
|
|
416
|
+
) {
|
|
417
|
+
if (!this.builder?.dataCube || this.saveState.isInProgress) {
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
this.saveState.inProgress();
|
|
422
|
+
try {
|
|
423
|
+
const persistentDataCube = await this.generatePersistentDataCube(
|
|
424
|
+
this.builder.dataCube,
|
|
425
|
+
name,
|
|
426
|
+
this.builder.persistentDataCube,
|
|
427
|
+
options,
|
|
428
|
+
);
|
|
429
|
+
|
|
430
|
+
if (options?.saveAsNew) {
|
|
431
|
+
persistentDataCube.id = uuid();
|
|
432
|
+
const newPersistentDataCube =
|
|
433
|
+
await this.baseStore.graphManager.createDataCube(persistentDataCube);
|
|
434
|
+
// NOTE: reload is the cleanest, least bug-prone handling here
|
|
435
|
+
// but we can opt for just updating the URL to reflect the new DataCube
|
|
436
|
+
// as an optimization. Also, it helps preserve the edition history
|
|
437
|
+
// on the existing data-cube.
|
|
438
|
+
//
|
|
439
|
+
// Another way to avoid reloading the whole app it to force update
|
|
440
|
+
// the <DataCube/> component using the key prop that ties to an ID
|
|
441
|
+
// of the builder.
|
|
442
|
+
this.application.navigationService.navigator.updateCurrentLocation(
|
|
443
|
+
generateBuilderRoute(newPersistentDataCube.id),
|
|
444
|
+
);
|
|
445
|
+
} else {
|
|
446
|
+
const updatedPersistentDataCube =
|
|
447
|
+
await this.baseStore.graphManager.updateDataCube(persistentDataCube);
|
|
448
|
+
this.builder.setPersistentDataCube(updatedPersistentDataCube);
|
|
449
|
+
}
|
|
450
|
+
this.updateWindowTitle(persistentDataCube);
|
|
451
|
+
if (options?.syncName) {
|
|
452
|
+
this.builder.dataCube.updateName(name);
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
this.saverDisplay.close();
|
|
456
|
+
this.saveState.pass();
|
|
457
|
+
} catch (error) {
|
|
458
|
+
assertErrorThrown(error);
|
|
459
|
+
this.alertService.alertError(error, {
|
|
460
|
+
message: `DataCube Update Failure: ${error.message}`,
|
|
461
|
+
});
|
|
462
|
+
this.saveState.fail();
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
setDataCubeToDelete(
|
|
467
|
+
val: LightPersistentDataCube | PersistentDataCube | undefined,
|
|
468
|
+
) {
|
|
469
|
+
this.dataCubeToDelete = val;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
async deleteDataCube() {
|
|
473
|
+
if (this.deleteState.isInProgress || !this.dataCubeToDelete) {
|
|
474
|
+
return;
|
|
475
|
+
}
|
|
476
|
+
const dataCubeId = this.dataCubeToDelete.id;
|
|
477
|
+
|
|
478
|
+
this.deleteState.inProgress();
|
|
479
|
+
try {
|
|
480
|
+
await this.baseStore.graphManager.deleteDataCube(dataCubeId);
|
|
481
|
+
|
|
482
|
+
// update the list of stack of recently viewed DataCubes
|
|
483
|
+
const recentlyViewedDataCubes = this.getRecentlyViewedDataCubes();
|
|
484
|
+
const idx = recentlyViewedDataCubes.findIndex(
|
|
485
|
+
(data) => data === dataCubeId,
|
|
486
|
+
);
|
|
487
|
+
if (idx !== -1) {
|
|
488
|
+
recentlyViewedDataCubes.splice(idx, 1);
|
|
489
|
+
this.application.userDataService.persistValue(
|
|
490
|
+
LegendDataCubeUserDataKey.RECENTLY_VIEWED_DATA_CUBES,
|
|
491
|
+
recentlyViewedDataCubes,
|
|
492
|
+
);
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
if (this.builder?.persistentDataCube?.id === dataCubeId) {
|
|
496
|
+
this.application.navigationService.navigator.updateCurrentLocation(
|
|
497
|
+
generateBuilderRoute(null),
|
|
498
|
+
);
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
if (this.loader.selectedResult?.id === dataCubeId) {
|
|
502
|
+
this.loader.setSelectedResult(undefined);
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
this.setDataCubeToDelete(undefined);
|
|
506
|
+
this.deleteConfirmationDisplay.close();
|
|
507
|
+
this.deleteState.pass();
|
|
508
|
+
} catch (error) {
|
|
509
|
+
assertErrorThrown(error);
|
|
510
|
+
this.alertService.alertError(error, {
|
|
511
|
+
message: `DataCube Delete Failure: ${error.message}`,
|
|
512
|
+
});
|
|
513
|
+
this.deleteState.fail();
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
}
|
|
@@ -22,31 +22,31 @@ import {
|
|
|
22
22
|
UnsupportedOperationError,
|
|
23
23
|
type PlainObject,
|
|
24
24
|
} from '@finos/legend-shared';
|
|
25
|
-
import { LegendQueryDataCubeSourceBuilderState } from './source
|
|
25
|
+
import { LegendQueryDataCubeSourceBuilderState } from './source/LegendQueryDataCubeSourceBuilderState.js';
|
|
26
26
|
import type { LegendDataCubeApplicationStore } from '../LegendDataCubeBaseStore.js';
|
|
27
27
|
import {
|
|
28
28
|
LegendDataCubeSourceBuilderType,
|
|
29
29
|
type LegendDataCubeSourceBuilderState,
|
|
30
|
-
} from './source
|
|
30
|
+
} from './source/LegendDataCubeSourceBuilderState.js';
|
|
31
31
|
import {
|
|
32
32
|
type DataCubeAlertService,
|
|
33
33
|
DEFAULT_TOOL_PANEL_WINDOW_CONFIG,
|
|
34
34
|
type DisplayState,
|
|
35
35
|
} from '@finos/legend-data-cube';
|
|
36
36
|
import type { LegendDataCubeDataCubeEngine } from '../LegendDataCubeDataCubeEngine.js';
|
|
37
|
-
import {
|
|
38
|
-
import { AdhocQueryDataCubeSourceBuilderState } from './source
|
|
37
|
+
import { LegendDataCubeCreator } from '../../components/builder/LegendDataCubeCreator.js';
|
|
38
|
+
import { AdhocQueryDataCubeSourceBuilderState } from './source/AdhocQueryDataCubeSourceBuilderState.js';
|
|
39
39
|
import {
|
|
40
|
-
|
|
41
|
-
type
|
|
42
|
-
} from './
|
|
43
|
-
import {
|
|
40
|
+
LegendDataCubeBuilderState,
|
|
41
|
+
type LegendDataCubeBuilderStore,
|
|
42
|
+
} from './LegendDataCubeBuilderStore.js';
|
|
43
|
+
import { generateBuilderRoute } from '../../__lib__/LegendDataCubeNavigation.js';
|
|
44
44
|
|
|
45
45
|
const DEFAULT_SOURCE_TYPE = LegendDataCubeSourceBuilderType.LEGEND_QUERY;
|
|
46
46
|
|
|
47
|
-
export class
|
|
47
|
+
export class LegendDataCubeCreatorState {
|
|
48
48
|
private readonly _application: LegendDataCubeApplicationStore;
|
|
49
|
-
private readonly _store:
|
|
49
|
+
private readonly _store: LegendDataCubeBuilderStore;
|
|
50
50
|
private readonly _engine: LegendDataCubeDataCubeEngine;
|
|
51
51
|
private readonly _alertService: DataCubeAlertService;
|
|
52
52
|
|
|
@@ -55,7 +55,7 @@ export class LegendDataCubeNewQueryState {
|
|
|
55
55
|
|
|
56
56
|
sourceBuilder: LegendDataCubeSourceBuilderState;
|
|
57
57
|
|
|
58
|
-
constructor(store:
|
|
58
|
+
constructor(store: LegendDataCubeBuilderStore) {
|
|
59
59
|
makeObservable(this, {
|
|
60
60
|
sourceBuilder: observable,
|
|
61
61
|
changeSourceBuilder: action,
|
|
@@ -67,8 +67,8 @@ export class LegendDataCubeNewQueryState {
|
|
|
67
67
|
this._alertService = store.alertService;
|
|
68
68
|
|
|
69
69
|
this.display = store.layoutService.newDisplay(
|
|
70
|
-
'New
|
|
71
|
-
() => <
|
|
70
|
+
'New DataCube',
|
|
71
|
+
() => <LegendDataCubeCreator />,
|
|
72
72
|
{
|
|
73
73
|
...DEFAULT_TOOL_PANEL_WINDOW_CONFIG,
|
|
74
74
|
width: 500,
|
|
@@ -114,24 +114,26 @@ export class LegendDataCubeNewQueryState {
|
|
|
114
114
|
|
|
115
115
|
async finalize(sourceData?: PlainObject) {
|
|
116
116
|
if (!sourceData && !this.sourceBuilder.isValid) {
|
|
117
|
-
throw new IllegalStateError(
|
|
117
|
+
throw new IllegalStateError(
|
|
118
|
+
`Can't generate DataCube: source is not valid`,
|
|
119
|
+
);
|
|
118
120
|
}
|
|
119
121
|
|
|
120
122
|
this.finalizeState.inProgress();
|
|
121
123
|
try {
|
|
122
|
-
const
|
|
124
|
+
const specification = await this._engine.generateBaseSpecification(
|
|
123
125
|
sourceData ?? (await this.sourceBuilder.generateSourceData()),
|
|
124
126
|
);
|
|
125
|
-
if (
|
|
126
|
-
this.sourceBuilder.finalizeConfiguration(
|
|
127
|
+
if (specification.configuration) {
|
|
128
|
+
this.sourceBuilder.finalizeConfiguration(specification.configuration);
|
|
127
129
|
}
|
|
128
130
|
|
|
129
131
|
// reset
|
|
130
|
-
this._store.setBuilder(new
|
|
132
|
+
this._store.setBuilder(new LegendDataCubeBuilderState(specification));
|
|
131
133
|
// only update the route instead of reloading in case we are creating
|
|
132
|
-
// a new
|
|
134
|
+
// a new DataCube when we are editing another DataCube
|
|
133
135
|
this._application.navigationService.navigator.updateCurrentLocation(
|
|
134
|
-
|
|
136
|
+
generateBuilderRoute(null),
|
|
135
137
|
);
|
|
136
138
|
this.changeSourceBuilder(DEFAULT_SOURCE_TYPE, true);
|
|
137
139
|
this.display.close();
|
|
@@ -139,7 +141,7 @@ export class LegendDataCubeNewQueryState {
|
|
|
139
141
|
} catch (error) {
|
|
140
142
|
assertErrorThrown(error);
|
|
141
143
|
this._alertService.alertError(error, {
|
|
142
|
-
message: `
|
|
144
|
+
message: `DataCube Creation Failure: ${error.message}`,
|
|
143
145
|
});
|
|
144
146
|
this.finalizeState.fail();
|
|
145
147
|
}
|