@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.
Files changed (150) hide show
  1. package/README.md +1 -1
  2. package/lib/__lib__/LegendDataCubeNavigation.d.ts +9 -5
  3. package/lib/__lib__/LegendDataCubeNavigation.d.ts.map +1 -1
  4. package/lib/__lib__/LegendDataCubeNavigation.js +9 -5
  5. package/lib/__lib__/LegendDataCubeNavigation.js.map +1 -1
  6. package/lib/__lib__/LegendDataCubeUserData.d.ts +2 -2
  7. package/lib/__lib__/LegendDataCubeUserData.d.ts.map +1 -1
  8. package/lib/__lib__/LegendDataCubeUserData.js +2 -2
  9. package/lib/__lib__/LegendDataCubeUserData.js.map +1 -1
  10. package/lib/application/LegendDataCubeApplicationConfig.d.ts +4 -0
  11. package/lib/application/LegendDataCubeApplicationConfig.d.ts.map +1 -1
  12. package/lib/application/LegendDataCubeApplicationConfig.js +5 -0
  13. package/lib/application/LegendDataCubeApplicationConfig.js.map +1 -1
  14. package/lib/components/LegendDataCubeBlockingWindow.d.ts +29 -0
  15. package/lib/components/LegendDataCubeBlockingWindow.d.ts.map +1 -0
  16. package/lib/components/LegendDataCubeBlockingWindow.js +75 -0
  17. package/lib/components/LegendDataCubeBlockingWindow.js.map +1 -0
  18. package/lib/components/LegendDataCubeWebApplication.js +2 -2
  19. package/lib/components/LegendDataCubeWebApplication.js.map +1 -1
  20. package/lib/components/builder/LegendDataCubeBuilder.d.ts +20 -0
  21. package/lib/components/builder/LegendDataCubeBuilder.d.ts.map +1 -0
  22. package/lib/components/builder/LegendDataCubeBuilder.js +162 -0
  23. package/lib/components/builder/LegendDataCubeBuilder.js.map +1 -0
  24. package/lib/components/builder/LegendDataCubeBuilderStoreProvider.d.ts +19 -0
  25. package/lib/components/builder/LegendDataCubeBuilderStoreProvider.d.ts.map +1 -0
  26. package/lib/components/builder/LegendDataCubeBuilderStoreProvider.js +34 -0
  27. package/lib/components/builder/LegendDataCubeBuilderStoreProvider.js.map +1 -0
  28. package/lib/components/{query-builder/LegendDataCubeQuerySaver.d.ts → builder/LegendDataCubeCreator.d.ts} +2 -2
  29. package/lib/components/builder/LegendDataCubeCreator.d.ts.map +1 -0
  30. package/lib/components/{query-builder/LegendDataCubeNewQueryBuilder.js → builder/LegendDataCubeCreator.js} +10 -10
  31. package/lib/components/builder/LegendDataCubeCreator.js.map +1 -0
  32. package/lib/components/builder/LegendDataCubeDeleteConfirmation.d.ts +19 -0
  33. package/lib/components/builder/LegendDataCubeDeleteConfirmation.d.ts.map +1 -0
  34. package/lib/components/builder/LegendDataCubeDeleteConfirmation.js +43 -0
  35. package/lib/components/builder/LegendDataCubeDeleteConfirmation.js.map +1 -0
  36. package/lib/components/{query-builder/LegendDataCubeQueryLoader.d.ts → builder/LegendDataCubeLoader.d.ts} +2 -2
  37. package/lib/components/builder/LegendDataCubeLoader.d.ts.map +1 -0
  38. package/lib/components/builder/LegendDataCubeLoader.js +113 -0
  39. package/lib/components/builder/LegendDataCubeLoader.js.map +1 -0
  40. package/lib/components/{query-builder/LegendDataCubeNewQueryBuilder.d.ts → builder/LegendDataCubeSaver.d.ts} +2 -2
  41. package/lib/components/builder/LegendDataCubeSaver.d.ts.map +1 -0
  42. package/lib/components/builder/LegendDataCubeSaver.js +73 -0
  43. package/lib/components/builder/LegendDataCubeSaver.js.map +1 -0
  44. package/lib/components/{query-builder/LegendDataCubeQueryBuilder.d.ts → builder/LegendDataCubeSourceViewer.d.ts} +4 -2
  45. package/lib/components/builder/LegendDataCubeSourceViewer.d.ts.map +1 -0
  46. package/lib/components/builder/LegendDataCubeSourceViewer.js +46 -0
  47. package/lib/components/builder/LegendDataCubeSourceViewer.js.map +1 -0
  48. package/lib/components/{query-builder/source-builder → builder/source}/AdhocQueryDataCubeSourceBuilder.d.ts +1 -1
  49. package/lib/components/builder/source/AdhocQueryDataCubeSourceBuilder.d.ts.map +1 -0
  50. package/lib/components/builder/source/AdhocQueryDataCubeSourceBuilder.js.map +1 -0
  51. package/lib/components/{query-builder/source-builder → builder/source}/LegendQueryDataCubeSourceBuilder.d.ts +1 -1
  52. package/lib/components/builder/source/LegendQueryDataCubeSourceBuilder.d.ts.map +1 -0
  53. package/lib/components/{query-builder/source-builder → builder/source}/LegendQueryDataCubeSourceBuilder.js +13 -13
  54. package/lib/components/builder/source/LegendQueryDataCubeSourceBuilder.js.map +1 -0
  55. package/lib/index.css +1 -1
  56. package/lib/package.json +1 -1
  57. package/lib/stores/LegendDataCubeCacheManager.d.ts.map +1 -1
  58. package/lib/stores/LegendDataCubeCacheManager.js +11 -12
  59. package/lib/stores/LegendDataCubeCacheManager.js.map +1 -1
  60. package/lib/stores/LegendDataCubeDataCubeEngine.d.ts +1 -1
  61. package/lib/stores/LegendDataCubeDataCubeEngine.d.ts.map +1 -1
  62. package/lib/stores/LegendDataCubeDataCubeEngine.js +5 -11
  63. package/lib/stores/LegendDataCubeDataCubeEngine.js.map +1 -1
  64. package/lib/stores/builder/LegendDataCubeBuilderStore.d.ts +80 -0
  65. package/lib/stores/builder/LegendDataCubeBuilderStore.d.ts.map +1 -0
  66. package/lib/stores/builder/LegendDataCubeBuilderStore.js +353 -0
  67. package/lib/stores/builder/LegendDataCubeBuilderStore.js.map +1 -0
  68. package/lib/stores/{query-builder/LegendDataCubeNewQueryState.d.ts → builder/LegendDataCubeCreatorState.d.ts} +5 -5
  69. package/lib/stores/builder/LegendDataCubeCreatorState.d.ts.map +1 -0
  70. package/lib/stores/{query-builder/LegendDataCubeNewQueryState.js → builder/LegendDataCubeCreatorState.js} +17 -17
  71. package/lib/stores/builder/LegendDataCubeCreatorState.js.map +1 -0
  72. package/lib/stores/{query-builder/LegendDataCubeQueryLoaderState.d.ts → builder/LegendDataCubeLoaderState.d.ts} +20 -20
  73. package/lib/stores/builder/LegendDataCubeLoaderState.d.ts.map +1 -0
  74. package/lib/stores/builder/LegendDataCubeLoaderState.js +187 -0
  75. package/lib/stores/builder/LegendDataCubeLoaderState.js.map +1 -0
  76. package/lib/stores/builder/source/AdhocQueryDataCubeSourceBuilderState.d.ts.map +1 -0
  77. package/lib/stores/builder/source/AdhocQueryDataCubeSourceBuilderState.js.map +1 -0
  78. package/lib/stores/builder/source/LegendDataCubeSourceBuilderState.d.ts.map +1 -0
  79. package/lib/stores/{query-builder/source-builder → builder/source}/LegendDataCubeSourceBuilderState.js +1 -1
  80. package/lib/stores/builder/source/LegendDataCubeSourceBuilderState.js.map +1 -0
  81. package/lib/stores/builder/source/LegendQueryDataCubeSourceBuilderState.d.ts.map +1 -0
  82. package/lib/stores/builder/source/LegendQueryDataCubeSourceBuilderState.js.map +1 -0
  83. package/package.json +5 -5
  84. package/src/__lib__/LegendDataCubeNavigation.ts +15 -7
  85. package/src/__lib__/LegendDataCubeUserData.ts +2 -2
  86. package/src/application/LegendDataCubeApplicationConfig.ts +12 -0
  87. package/src/components/LegendDataCubeBlockingWindow.tsx +120 -0
  88. package/src/components/LegendDataCubeWebApplication.tsx +3 -3
  89. package/src/components/builder/LegendDataCubeBuilder.tsx +331 -0
  90. package/src/components/{query-builder/LegendDataCubeQueryBuilderStoreProvider.tsx → builder/LegendDataCubeBuilderStoreProvider.tsx} +19 -16
  91. package/src/components/{query-builder/LegendDataCubeNewQueryBuilder.tsx → builder/LegendDataCubeCreator.tsx} +9 -9
  92. package/src/components/builder/LegendDataCubeDeleteConfirmation.tsx +87 -0
  93. package/src/components/{query-builder/LegendDataCubeQueryLoader.tsx → builder/LegendDataCubeLoader.tsx} +122 -59
  94. package/src/components/builder/LegendDataCubeSaver.tsx +184 -0
  95. package/src/components/builder/LegendDataCubeSourceViewer.tsx +108 -0
  96. package/src/components/{query-builder/source-builder → builder/source}/AdhocQueryDataCubeSourceBuilder.tsx +1 -1
  97. package/src/components/{query-builder/source-builder → builder/source}/LegendQueryDataCubeSourceBuilder.tsx +16 -15
  98. package/src/stores/LegendDataCubeCacheManager.ts +11 -12
  99. package/src/stores/LegendDataCubeDataCubeEngine.ts +4 -14
  100. package/src/stores/builder/LegendDataCubeBuilderStore.tsx +516 -0
  101. package/src/stores/{query-builder/LegendDataCubeNewQueryState.tsx → builder/LegendDataCubeCreatorState.tsx} +23 -21
  102. package/src/stores/builder/LegendDataCubeLoaderState.tsx +248 -0
  103. package/src/stores/{query-builder/source-builder → builder/source}/LegendDataCubeSourceBuilderState.ts +1 -1
  104. package/tsconfig.json +16 -13
  105. package/lib/components/query-builder/LegendDataCubeNewQueryBuilder.d.ts.map +0 -1
  106. package/lib/components/query-builder/LegendDataCubeNewQueryBuilder.js.map +0 -1
  107. package/lib/components/query-builder/LegendDataCubeQueryBuilder.d.ts.map +0 -1
  108. package/lib/components/query-builder/LegendDataCubeQueryBuilder.js +0 -93
  109. package/lib/components/query-builder/LegendDataCubeQueryBuilder.js.map +0 -1
  110. package/lib/components/query-builder/LegendDataCubeQueryBuilderStoreProvider.d.ts +0 -19
  111. package/lib/components/query-builder/LegendDataCubeQueryBuilderStoreProvider.d.ts.map +0 -1
  112. package/lib/components/query-builder/LegendDataCubeQueryBuilderStoreProvider.js +0 -33
  113. package/lib/components/query-builder/LegendDataCubeQueryBuilderStoreProvider.js.map +0 -1
  114. package/lib/components/query-builder/LegendDataCubeQueryLoader.d.ts.map +0 -1
  115. package/lib/components/query-builder/LegendDataCubeQueryLoader.js +0 -97
  116. package/lib/components/query-builder/LegendDataCubeQueryLoader.js.map +0 -1
  117. package/lib/components/query-builder/LegendDataCubeQuerySaver.d.ts.map +0 -1
  118. package/lib/components/query-builder/LegendDataCubeQuerySaver.js +0 -51
  119. package/lib/components/query-builder/LegendDataCubeQuerySaver.js.map +0 -1
  120. package/lib/components/query-builder/source-builder/AdhocQueryDataCubeSourceBuilder.d.ts.map +0 -1
  121. package/lib/components/query-builder/source-builder/AdhocQueryDataCubeSourceBuilder.js.map +0 -1
  122. package/lib/components/query-builder/source-builder/LegendQueryDataCubeSourceBuilder.d.ts.map +0 -1
  123. package/lib/components/query-builder/source-builder/LegendQueryDataCubeSourceBuilder.js.map +0 -1
  124. package/lib/stores/query-builder/LegendDataCubeNewQueryState.d.ts.map +0 -1
  125. package/lib/stores/query-builder/LegendDataCubeNewQueryState.js.map +0 -1
  126. package/lib/stores/query-builder/LegendDataCubeQueryBuilderStore.d.ts +0 -58
  127. package/lib/stores/query-builder/LegendDataCubeQueryBuilderStore.d.ts.map +0 -1
  128. package/lib/stores/query-builder/LegendDataCubeQueryBuilderStore.js +0 -228
  129. package/lib/stores/query-builder/LegendDataCubeQueryBuilderStore.js.map +0 -1
  130. package/lib/stores/query-builder/LegendDataCubeQueryLoaderState.d.ts.map +0 -1
  131. package/lib/stores/query-builder/LegendDataCubeQueryLoaderState.js +0 -198
  132. package/lib/stores/query-builder/LegendDataCubeQueryLoaderState.js.map +0 -1
  133. package/lib/stores/query-builder/source-builder/AdhocQueryDataCubeSourceBuilderState.d.ts.map +0 -1
  134. package/lib/stores/query-builder/source-builder/AdhocQueryDataCubeSourceBuilderState.js.map +0 -1
  135. package/lib/stores/query-builder/source-builder/LegendDataCubeSourceBuilderState.d.ts.map +0 -1
  136. package/lib/stores/query-builder/source-builder/LegendDataCubeSourceBuilderState.js.map +0 -1
  137. package/lib/stores/query-builder/source-builder/LegendQueryDataCubeSourceBuilderState.d.ts.map +0 -1
  138. package/lib/stores/query-builder/source-builder/LegendQueryDataCubeSourceBuilderState.js.map +0 -1
  139. package/src/components/query-builder/LegendDataCubeQueryBuilder.tsx +0 -164
  140. package/src/components/query-builder/LegendDataCubeQuerySaver.tsx +0 -116
  141. package/src/stores/query-builder/LegendDataCubeQueryBuilderStore.tsx +0 -323
  142. package/src/stores/query-builder/LegendDataCubeQueryLoaderState.tsx +0 -260
  143. /package/lib/components/{query-builder/source-builder → builder/source}/AdhocQueryDataCubeSourceBuilder.js +0 -0
  144. /package/lib/stores/{query-builder/source-builder → builder/source}/AdhocQueryDataCubeSourceBuilderState.d.ts +0 -0
  145. /package/lib/stores/{query-builder/source-builder → builder/source}/AdhocQueryDataCubeSourceBuilderState.js +0 -0
  146. /package/lib/stores/{query-builder/source-builder → builder/source}/LegendDataCubeSourceBuilderState.d.ts +0 -0
  147. /package/lib/stores/{query-builder/source-builder → builder/source}/LegendQueryDataCubeSourceBuilderState.d.ts +0 -0
  148. /package/lib/stores/{query-builder/source-builder → builder/source}/LegendQueryDataCubeSourceBuilderState.js +0 -0
  149. /package/src/stores/{query-builder/source-builder → builder/source}/AdhocQueryDataCubeSourceBuilderState.ts +0 -0
  150. /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-builder/LegendQueryDataCubeSourceBuilderState.js';
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-builder/LegendDataCubeSourceBuilderState.js';
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 { LegendDataCubeNewQueryBuilder } from '../../components/query-builder/LegendDataCubeNewQueryBuilder.js';
38
- import { AdhocQueryDataCubeSourceBuilderState } from './source-builder/AdhocQueryDataCubeSourceBuilderState.js';
37
+ import { LegendDataCubeCreator } from '../../components/builder/LegendDataCubeCreator.js';
38
+ import { AdhocQueryDataCubeSourceBuilderState } from './source/AdhocQueryDataCubeSourceBuilderState.js';
39
39
  import {
40
- LegendDataCubeQueryBuilderState,
41
- type LegendDataCubeQueryBuilderStore,
42
- } from './LegendDataCubeQueryBuilderStore.js';
43
- import { generateQueryBuilderRoute } from '../../__lib__/LegendDataCubeNavigation.js';
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 LegendDataCubeNewQueryState {
47
+ export class LegendDataCubeCreatorState {
48
48
  private readonly _application: LegendDataCubeApplicationStore;
49
- private readonly _store: LegendDataCubeQueryBuilderStore;
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: LegendDataCubeQueryBuilderStore) {
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 Query',
71
- () => <LegendDataCubeNewQueryBuilder />,
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(`Can't generate query: source is not valid`);
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 query = await this._engine.generateBaseQuery(
124
+ const specification = await this._engine.generateBaseSpecification(
123
125
  sourceData ?? (await this.sourceBuilder.generateSourceData()),
124
126
  );
125
- if (query.configuration) {
126
- this.sourceBuilder.finalizeConfiguration(query.configuration);
127
+ if (specification.configuration) {
128
+ this.sourceBuilder.finalizeConfiguration(specification.configuration);
127
129
  }
128
130
 
129
131
  // reset
130
- this._store.setBuilder(new LegendDataCubeQueryBuilderState(query));
132
+ this._store.setBuilder(new LegendDataCubeBuilderState(specification));
131
133
  // only update the route instead of reloading in case we are creating
132
- // a new query when we are editing another query
134
+ // a new DataCube when we are editing another DataCube
133
135
  this._application.navigationService.navigator.updateCurrentLocation(
134
- generateQueryBuilderRoute(null),
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: `Query Creation Failure: ${error.message}`,
144
+ message: `DataCube Creation Failure: ${error.message}`,
143
145
  });
144
146
  this.finalizeState.fail();
145
147
  }