@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,331 @@
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 { observer } from 'mobx-react-lite';
18
+ import {
19
+ DataCube,
20
+ FormButton,
21
+ type DataCubeSettingValues,
22
+ DataCubePlaceholder,
23
+ DataCubeNativeMenuItem,
24
+ DataCubePlaceholderErrorDisplay,
25
+ type DataCubeMenuItem,
26
+ DataCubeSpecification,
27
+ } from '@finos/legend-data-cube';
28
+ import {} from '@finos/legend-art';
29
+ import {
30
+ useLegendDataCubeBuilderStore,
31
+ withLegendDataCubeBuilderStore,
32
+ } from './LegendDataCubeBuilderStoreProvider.js';
33
+ import { useParams } from '@finos/legend-application/browser';
34
+ import {
35
+ LEGEND_DATA_CUBE_ROUTE_PATTERN_TOKEN,
36
+ type LegendDataCubeBuilderPathParams,
37
+ } from '../../__lib__/LegendDataCubeNavigation.js';
38
+ import { useEffect } from 'react';
39
+ import { LegendDataCubeSettingStorageKey } from '../../__lib__/LegendDataCubeSetting.js';
40
+ import type { LegendDataCubeBuilderStore } from '../../stores/builder/LegendDataCubeBuilderStore.js';
41
+
42
+ const LegendDataCubeBuilderHeader = observer(() => {
43
+ const store = useLegendDataCubeBuilderStore();
44
+
45
+ return (
46
+ <div className="flex h-full items-center">
47
+ <FormButton compact={true} onClick={() => store.loader.display.open()}>
48
+ Load DataCube
49
+ </FormButton>
50
+ <FormButton
51
+ compact={true}
52
+ className="ml-1.5"
53
+ onClick={() => store.creator.display.open()}
54
+ >
55
+ New DataCube
56
+ </FormButton>
57
+ <FormButton
58
+ compact={true}
59
+ className="ml-1.5"
60
+ disabled={!store.builder?.dataCube}
61
+ onClick={() => store.saverDisplay.open()}
62
+ >
63
+ Save DataCube
64
+ </FormButton>
65
+ </div>
66
+ );
67
+ });
68
+
69
+ export const LegendDataCubeAbout = observer(() => {
70
+ const store = useLegendDataCubeBuilderStore();
71
+ const config = store.application.config;
72
+
73
+ return (
74
+ <div className="h-full items-center p-4">
75
+ <div className="my-0.5 flex font-mono">
76
+ <div>Environment:</div>
77
+ <div className="ml-1 font-bold">{config.env}</div>
78
+ </div>
79
+ <div className="my-0.5 flex font-mono">
80
+ <div>Version:</div>
81
+ <div className="ml-1 font-bold">{config.appVersion}</div>
82
+ </div>
83
+ <div className="my-0.5 flex font-mono">
84
+ <div>Revision:</div>
85
+ <div className="ml-1 font-bold">{config.appVersionCommitId}</div>
86
+ </div>
87
+ <div className="my-0.5 flex font-mono">
88
+ <div>Build Time:</div>
89
+ <div className="ml-1 font-bold">{config.appVersionBuildTime}</div>
90
+ </div>
91
+ <div className="mt-3 rounded-sm bg-white px-4 py-2">
92
+ <div className="my-0.5 flex font-mono">
93
+ <div>Engine Server:</div>
94
+ <div className="ml-1 font-bold text-sky-500 underline">
95
+ <a
96
+ href={config.engineServerUrl}
97
+ target="_blank"
98
+ rel="noopener noreferrer"
99
+ >
100
+ {config.engineServerUrl}
101
+ </a>
102
+ </div>
103
+ </div>
104
+ <div className="my-0.5 flex font-mono">
105
+ <div>Depot Server:</div>
106
+ <div className="ml-1 font-bold text-sky-500 underline">
107
+ <a
108
+ href={config.depotServerUrl}
109
+ target="_blank"
110
+ rel="noopener noreferrer"
111
+ >
112
+ {config.depotServerUrl}
113
+ </a>
114
+ </div>
115
+ </div>
116
+ {config.engineQueryServerUrl !== undefined && (
117
+ <div className="my-0.5 flex font-mono">
118
+ <div>DataCube Server:</div>
119
+ <div className="ml-1 font-bold text-sky-500 underline">
120
+ <a
121
+ href={config.engineQueryServerUrl}
122
+ target="_blank"
123
+ rel="noopener noreferrer"
124
+ >
125
+ {config.engineQueryServerUrl}
126
+ </a>
127
+ </div>
128
+ </div>
129
+ )}
130
+ </div>
131
+ </div>
132
+ );
133
+ });
134
+
135
+ function generateMenuItems(store: LegendDataCubeBuilderStore) {
136
+ const application = store.application;
137
+ const builder = store.builder;
138
+ const persistentDataCube = builder?.persistentDataCube;
139
+
140
+ const menuItems: (DataCubeMenuItem | DataCubeNativeMenuItem)[] = builder
141
+ ? [
142
+ ...(builder.source
143
+ ? [
144
+ {
145
+ label: 'View Source',
146
+ action: () => {
147
+ store.sourceViewerDisplay.open();
148
+ },
149
+ },
150
+ ]
151
+ : []),
152
+ ...(persistentDataCube
153
+ ? [
154
+ {
155
+ label: 'Reset to Latest Save',
156
+ action: () => {
157
+ const latestSpecification =
158
+ DataCubeSpecification.serialization.fromJson(
159
+ persistentDataCube.content,
160
+ );
161
+ builder.dataCube
162
+ ?.applySpecification(latestSpecification)
163
+ .catch((error) =>
164
+ store.alertService.alertUnhandledError(error),
165
+ );
166
+ },
167
+ },
168
+ {
169
+ label: 'Update Info...',
170
+ action: () => {
171
+ // effectively, we open the save window to let user update the DataCube info, such as name, auto-enable caching, etc.
172
+ store.saverDisplay.open();
173
+ },
174
+ disabled:
175
+ !store.canCurrentUserManageDataCube(persistentDataCube),
176
+ },
177
+ {
178
+ label: 'Delete DataCube...',
179
+ action: () => {
180
+ store.setDataCubeToDelete(builder.persistentDataCube);
181
+ store.deleteConfirmationDisplay.open();
182
+ },
183
+ disabled:
184
+ !store.canCurrentUserManageDataCube(persistentDataCube),
185
+ },
186
+ ]
187
+ : []),
188
+ ]
189
+ : [];
190
+ return [
191
+ ...(menuItems.length
192
+ ? [...menuItems, DataCubeNativeMenuItem.SEPARATOR]
193
+ : []),
194
+ {
195
+ label: 'See Documentation',
196
+ action: () => {
197
+ const url = application.documentationService.url;
198
+ if (url) {
199
+ application.navigationService.navigator.visitAddress(
200
+ application.documentationService.url,
201
+ );
202
+ }
203
+ },
204
+ disabled: !application.documentationService.url,
205
+ },
206
+ {
207
+ label: 'About',
208
+ action: () => {
209
+ store.aboutDisplay.open();
210
+ },
211
+ },
212
+ ];
213
+ }
214
+
215
+ export const LegendDataCubeBuilder = withLegendDataCubeBuilderStore(
216
+ observer(() => {
217
+ const store = useLegendDataCubeBuilderStore();
218
+ const builder = store.builder;
219
+ const application = store.application;
220
+ const params = useParams<LegendDataCubeBuilderPathParams>();
221
+ const dataCubeId =
222
+ params[LEGEND_DATA_CUBE_ROUTE_PATTERN_TOKEN.DATA_CUBE_ID];
223
+
224
+ useEffect(() => {
225
+ application.navigationService.navigator.blockNavigation(
226
+ // Only block navigation in production, in development, we should have
227
+ // the flexibility to reload the page quickly
228
+ // eslint-disable-next-line no-process-env
229
+ [() => process.env.NODE_ENV === 'production'],
230
+ );
231
+ return (): void => {
232
+ application.navigationService.navigator.unblockNavigation();
233
+ };
234
+ }, [application]);
235
+
236
+ useEffect(() => {
237
+ store
238
+ .initialize()
239
+ .catch((error) => store.alertService.alertUnhandledError(error));
240
+ return () => {
241
+ store
242
+ .cleanUp()
243
+ .catch((error) => store.alertService.alertUnhandledError(error));
244
+ };
245
+ }, [store]);
246
+
247
+ useEffect(() => {
248
+ store
249
+ .loadDataCube(dataCubeId)
250
+ .catch((error) => store.alertService.alertUnhandledError(error));
251
+ }, [store, dataCubeId]);
252
+
253
+ if (!store.initializeState.hasSucceeded) {
254
+ return (
255
+ <DataCubePlaceholder
256
+ title="[ Legend DataCube ]"
257
+ layoutManager={store.layoutService.manager}
258
+ taskManager={store.taskService.manager}
259
+ headerContent={<LegendDataCubeBuilderHeader />}
260
+ menuItems={generateMenuItems(store)}
261
+ >
262
+ {store.initializeState.isInProgress && (
263
+ <div className="h-full w-full p-2">
264
+ <div>Initializing...</div>
265
+ </div>
266
+ )}
267
+ {store.initializeState.hasFailed && (
268
+ <DataCubePlaceholderErrorDisplay
269
+ message="Initialization Failure"
270
+ prompt="Resolve the issue and reload."
271
+ />
272
+ )}
273
+ </DataCubePlaceholder>
274
+ );
275
+ }
276
+ if (!builder) {
277
+ return (
278
+ <DataCubePlaceholder
279
+ title="[ Legend DataCube ]"
280
+ layoutManager={store.layoutService.manager}
281
+ taskManager={store.taskService.manager}
282
+ headerContent={<LegendDataCubeBuilderHeader />}
283
+ menuItems={generateMenuItems(store)}
284
+ >
285
+ <div className="h-full w-full p-2">
286
+ <div>Create a new DataCube to start</div>
287
+ <FormButton
288
+ className="mt-1.5"
289
+ onClick={() => store.creator.display.open()}
290
+ >
291
+ New DataCube
292
+ </FormButton>
293
+ </div>
294
+ </DataCubePlaceholder>
295
+ );
296
+ }
297
+ return (
298
+ <DataCube
299
+ key={builder.uuid} // used as mechanism to reload data-cube component when changing between DataCubes or between create/edit mode
300
+ specification={builder.initialSpecification}
301
+ engine={store.baseStore.engine}
302
+ options={{
303
+ layoutManager: store.layoutService.manager,
304
+ taskManager: store.taskService.manager,
305
+ gridClientLicense: store.baseStore.gridClientLicense,
306
+ onInitialized(event) {
307
+ builder.setDataCube(event.api);
308
+ },
309
+ onViewInitialized(event) {
310
+ builder.setSource(event.source);
311
+ },
312
+ innerHeaderRenderer: () => <LegendDataCubeBuilderHeader />,
313
+ getHeaderMenuItems: () => generateMenuItems(store),
314
+ settingsData: {
315
+ configurations: store.baseStore.settings,
316
+ values: application.settingService.getObjectValue(
317
+ LegendDataCubeSettingStorageKey.DATA_CUBE,
318
+ ) as DataCubeSettingValues | undefined,
319
+ },
320
+ onSettingsChanged(event) {
321
+ application.settingService.persistValue(
322
+ LegendDataCubeSettingStorageKey.DATA_CUBE,
323
+ event.values,
324
+ );
325
+ },
326
+ enableCache: true,
327
+ }}
328
+ />
329
+ );
330
+ }),
331
+ );
@@ -17,40 +17,43 @@
17
17
  import { guaranteeNonNullable } from '@finos/legend-shared';
18
18
  import { useLocalObservable } from 'mobx-react-lite';
19
19
  import { createContext, useContext } from 'react';
20
- import { LegendDataCubeQueryBuilderStore } from '../../stores/query-builder/LegendDataCubeQueryBuilderStore.js';
20
+ import { LegendDataCubeBuilderStore } from '../../stores/builder/LegendDataCubeBuilderStore.js';
21
21
  import { useLegendDataCubeBaseStore } from '../LegendDataCubeFrameworkProvider.js';
22
+ import { LegendDataCubeBlockingWindow } from '../LegendDataCubeBlockingWindow.js';
22
23
 
23
- const LegendDataCubeQueryBuilderStoreContext = createContext<
24
- LegendDataCubeQueryBuilderStore | undefined
24
+ const LegendDataCubeBuilderStoreContext = createContext<
25
+ LegendDataCubeBuilderStore | undefined
25
26
  >(undefined);
26
- const LegendDataCubeQueryBuilderStoreProvider = (props: {
27
+ const LegendDataCubeBuilderStoreProvider = (props: {
27
28
  children: React.ReactNode;
28
29
  }) => {
29
30
  const { children } = props;
30
31
  const baseStore = useLegendDataCubeBaseStore();
31
32
  const store = useLocalObservable(
32
- () => new LegendDataCubeQueryBuilderStore(baseStore),
33
+ () => new LegendDataCubeBuilderStore(baseStore),
33
34
  );
34
35
  return (
35
- <LegendDataCubeQueryBuilderStoreContext.Provider value={store}>
36
+ <LegendDataCubeBuilderStoreContext.Provider value={store}>
36
37
  {children}
37
- </LegendDataCubeQueryBuilderStoreContext.Provider>
38
+ <LegendDataCubeBlockingWindow windowState={store.saverDisplay} />
39
+ <LegendDataCubeBlockingWindow
40
+ windowState={store.deleteConfirmationDisplay}
41
+ />
42
+ </LegendDataCubeBuilderStoreContext.Provider>
38
43
  );
39
44
  };
40
45
 
41
- export const useLegendDataCubeQueryBuilderStore = () =>
46
+ export const useLegendDataCubeBuilderStore = () =>
42
47
  guaranteeNonNullable(
43
- useContext(LegendDataCubeQueryBuilderStoreContext),
44
- `Can't find query builder store in context`,
48
+ useContext(LegendDataCubeBuilderStoreContext),
49
+ `Can't find builder store in context`,
45
50
  );
46
51
 
47
- export const withLegendDataCubeQueryBuilderStore = (
48
- WrappedComponent: React.FC,
49
- ) =>
50
- function WithLegendDataCubeQueryBuilderStore() {
52
+ export const withLegendDataCubeBuilderStore = (WrappedComponent: React.FC) =>
53
+ function WithLegendDataCubeBuilderStore() {
51
54
  return (
52
- <LegendDataCubeQueryBuilderStoreProvider>
55
+ <LegendDataCubeBuilderStoreProvider>
53
56
  <WrappedComponent />
54
- </LegendDataCubeQueryBuilderStoreProvider>
57
+ </LegendDataCubeBuilderStoreProvider>
55
58
  );
56
59
  };
@@ -15,7 +15,7 @@
15
15
  */
16
16
 
17
17
  import { observer } from 'mobx-react-lite';
18
- import { LegendDataCubeSourceBuilderType } from '../../stores/query-builder/source-builder/LegendDataCubeSourceBuilderState.js';
18
+ import { LegendDataCubeSourceBuilderType } from '../../stores/builder/source/LegendDataCubeSourceBuilderState.js';
19
19
  import { useDropdownMenu } from '@finos/legend-art';
20
20
  import {
21
21
  FormButton,
@@ -23,15 +23,15 @@ import {
23
23
  FormDropdownMenuItem,
24
24
  FormDropdownMenuTrigger,
25
25
  } from '@finos/legend-data-cube';
26
- import { LegendQueryDataCubeSourceBuilderState } from '../../stores/query-builder/source-builder/LegendQueryDataCubeSourceBuilderState.js';
27
- import { LegendQueryDataCubeSourceBuilder } from './source-builder/LegendQueryDataCubeSourceBuilder.js';
28
- import { AdhocQueryDataCubeSourceBuilder } from './source-builder/AdhocQueryDataCubeSourceBuilder.js';
29
- import { AdhocQueryDataCubeSourceBuilderState } from '../../stores/query-builder/source-builder/AdhocQueryDataCubeSourceBuilderState.js';
30
- import { useLegendDataCubeQueryBuilderStore } from './LegendDataCubeQueryBuilderStoreProvider.js';
26
+ import { LegendQueryDataCubeSourceBuilderState } from '../../stores/builder/source/LegendQueryDataCubeSourceBuilderState.js';
27
+ import { LegendQueryDataCubeSourceBuilder } from './source/LegendQueryDataCubeSourceBuilder.js';
28
+ import { AdhocQueryDataCubeSourceBuilder } from './source/AdhocQueryDataCubeSourceBuilder.js';
29
+ import { AdhocQueryDataCubeSourceBuilderState } from '../../stores/builder/source/AdhocQueryDataCubeSourceBuilderState.js';
30
+ import { useLegendDataCubeBuilderStore } from './LegendDataCubeBuilderStoreProvider.js';
31
31
 
32
- export const LegendDataCubeNewQueryBuilder = observer(() => {
33
- const store = useLegendDataCubeQueryBuilderStore();
34
- const state = store.newQueryState;
32
+ export const LegendDataCubeCreator = observer(() => {
33
+ const store = useLegendDataCubeBuilderStore();
34
+ const state = store.creator;
35
35
  const sourceBuilder = state.sourceBuilder;
36
36
  const selectedSourceType = sourceBuilder.label;
37
37
  const [
@@ -0,0 +1,87 @@
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 { FormButton, FormTextInput } from '@finos/legend-data-cube';
18
+ import { observer } from 'mobx-react-lite';
19
+ import { useEffect, useState } from 'react';
20
+ import { useLegendDataCubeBuilderStore } from './LegendDataCubeBuilderStoreProvider.js';
21
+ import { formatDate } from '@finos/legend-shared';
22
+ import { useApplicationStore } from '@finos/legend-application';
23
+
24
+ export const LegendDataCubeDeleteConfirmation = observer(() => {
25
+ const [text, setText] = useState('');
26
+ const store = useLegendDataCubeBuilderStore();
27
+ const application = useApplicationStore();
28
+ const persistentDataCube = store.dataCubeToDelete;
29
+ const confirmationText = `${application.identityService.isAnonymous ? '' : application.identityService.currentUser}_${formatDate(Date.now(), 'yyyyMMdd')}`;
30
+
31
+ useEffect(() => {
32
+ setText('');
33
+ }, [persistentDataCube]);
34
+
35
+ if (!persistentDataCube) {
36
+ return null;
37
+ }
38
+ return (
39
+ <>
40
+ <div className="h-[calc(100%_-_40px)] w-full px-2 pt-2">
41
+ <div className="h-full w-full overflow-auto border border-neutral-300 bg-white">
42
+ <div className="h-full w-full p-2">
43
+ <div>
44
+ <div className="whitespace-break-spaces">
45
+ You are about to delete this DataCube. Once deleted, it{' '}
46
+ <span className="font-bold">cannot be recovered</span>
47
+ <br />
48
+ Please type the following to confirm:
49
+ <span className="ml-1 rounded-sm bg-neutral-100 p-0.5 font-mono font-bold text-red-500">
50
+ {confirmationText}
51
+ </span>
52
+ </div>
53
+ <div className="mt-1 whitespace-break-spaces text-neutral-500">
54
+ {text}
55
+ </div>
56
+ </div>
57
+ <div className="flex h-6 w-full items-center">
58
+ <FormTextInput
59
+ className="w-full"
60
+ value={text}
61
+ onChange={(event) => {
62
+ setText(event.target.value);
63
+ }}
64
+ />
65
+ </div>
66
+ </div>
67
+ </div>
68
+ </div>
69
+ <div className="flex h-10 items-center justify-end px-2">
70
+ <FormButton onClick={() => store.deleteConfirmationDisplay.close()}>
71
+ Cancel
72
+ </FormButton>
73
+ <FormButton
74
+ className="ml-2"
75
+ disabled={store.deleteState.isInProgress || text !== confirmationText}
76
+ onClick={() => {
77
+ store
78
+ .deleteDataCube()
79
+ .catch((error) => store.alertService.alertUnhandledError(error));
80
+ }}
81
+ >
82
+ Delete
83
+ </FormButton>
84
+ </div>
85
+ </>
86
+ );
87
+ });