@finos/legend-extension-dsl-data-space 10.4.250 → 10.4.252

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 (95) hide show
  1. package/lib/components/DataSpaceDataAccess.d.ts.map +1 -1
  2. package/lib/components/DataSpaceDataAccess.js +2 -1
  3. package/lib/components/DataSpaceDataAccess.js.map +1 -1
  4. package/lib/components/DataSpaceExecutionContextViewer.d.ts +8 -1
  5. package/lib/components/DataSpaceExecutionContextViewer.d.ts.map +1 -1
  6. package/lib/components/DataSpaceExecutionContextViewer.js +72 -11
  7. package/lib/components/DataSpaceExecutionContextViewer.js.map +1 -1
  8. package/lib/components/DataSpaceLegendAIIntegration.d.ts.map +1 -1
  9. package/lib/components/DataSpaceLegendAIIntegration.js +14 -8
  10. package/lib/components/DataSpaceLegendAIIntegration.js.map +1 -1
  11. package/lib/components/DataSpaceLegendAISchema.d.ts +1 -1
  12. package/lib/components/DataSpaceLegendAISchema.d.ts.map +1 -1
  13. package/lib/components/DataSpaceLegendAISchema.js +5 -3
  14. package/lib/components/DataSpaceLegendAISchema.js.map +1 -1
  15. package/lib/components/DataSpaceQuickStart.d.ts.map +1 -1
  16. package/lib/components/DataSpaceQuickStart.js +64 -34
  17. package/lib/components/DataSpaceQuickStart.js.map +1 -1
  18. package/lib/components/DataSpaceViewer.d.ts.map +1 -1
  19. package/lib/components/DataSpaceViewer.js +6 -4
  20. package/lib/components/DataSpaceViewer.js.map +1 -1
  21. package/lib/components/DataSpaceViewerActivityBar.d.ts.map +1 -1
  22. package/lib/components/DataSpaceViewerActivityBar.js +10 -5
  23. package/lib/components/DataSpaceViewerActivityBar.js.map +1 -1
  24. package/lib/components/__test-utils__/DataSpaceViewerTestUtils.d.ts +37 -0
  25. package/lib/components/__test-utils__/DataSpaceViewerTestUtils.d.ts.map +1 -0
  26. package/lib/components/__test-utils__/DataSpaceViewerTestUtils.js +103 -0
  27. package/lib/components/__test-utils__/DataSpaceViewerTestUtils.js.map +1 -0
  28. package/lib/components/query-builder/DataSpaceQueryBuilder.d.ts +1 -0
  29. package/lib/components/query-builder/DataSpaceQueryBuilder.d.ts.map +1 -1
  30. package/lib/components/query-builder/DataSpaceQueryBuilder.js +2 -1
  31. package/lib/components/query-builder/DataSpaceQueryBuilder.js.map +1 -1
  32. package/lib/components/query-builder/index.d.ts +1 -1
  33. package/lib/components/query-builder/index.d.ts.map +1 -1
  34. package/lib/components/query-builder/index.js +1 -1
  35. package/lib/components/query-builder/index.js.map +1 -1
  36. package/lib/graph-manager/action/analytics/DataSpaceAnalysis.d.ts +14 -4
  37. package/lib/graph-manager/action/analytics/DataSpaceAnalysis.d.ts.map +1 -1
  38. package/lib/graph-manager/action/analytics/DataSpaceAnalysis.js +10 -0
  39. package/lib/graph-manager/action/analytics/DataSpaceAnalysis.js.map +1 -1
  40. package/lib/graph-manager/index.d.ts +1 -1
  41. package/lib/graph-manager/index.d.ts.map +1 -1
  42. package/lib/graph-manager/index.js +1 -1
  43. package/lib/graph-manager/index.js.map +1 -1
  44. package/lib/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.d.ts.map +1 -1
  45. package/lib/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.js +45 -4
  46. package/lib/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.js.map +1 -1
  47. package/lib/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_SystemModels.json +2 -2
  48. package/lib/graph-manager/protocol/pure/v1/engine/analytics/V1_DataSpaceAnalysis.d.ts +14 -3
  49. package/lib/graph-manager/protocol/pure/v1/engine/analytics/V1_DataSpaceAnalysis.d.ts.map +1 -1
  50. package/lib/graph-manager/protocol/pure/v1/engine/analytics/V1_DataSpaceAnalysis.js +25 -5
  51. package/lib/graph-manager/protocol/pure/v1/engine/analytics/V1_DataSpaceAnalysis.js.map +1 -1
  52. package/lib/index.css +2 -2
  53. package/lib/index.css.map +1 -1
  54. package/lib/package.json +6 -1
  55. package/lib/stores/DataSpaceMappingProviderAccessState.d.ts +62 -0
  56. package/lib/stores/DataSpaceMappingProviderAccessState.d.ts.map +1 -0
  57. package/lib/stores/DataSpaceMappingProviderAccessState.js +105 -0
  58. package/lib/stores/DataSpaceMappingProviderAccessState.js.map +1 -0
  59. package/lib/stores/DataSpaceViewerExecutableState.d.ts +13 -2
  60. package/lib/stores/DataSpaceViewerExecutableState.d.ts.map +1 -1
  61. package/lib/stores/DataSpaceViewerExecutableState.js +36 -4
  62. package/lib/stores/DataSpaceViewerExecutableState.js.map +1 -1
  63. package/lib/stores/DataSpaceViewerState.d.ts +30 -3
  64. package/lib/stores/DataSpaceViewerState.d.ts.map +1 -1
  65. package/lib/stores/DataSpaceViewerState.js +86 -17
  66. package/lib/stores/DataSpaceViewerState.js.map +1 -1
  67. package/lib/stores/query/DataSpaceAdvancedSearchState.d.ts.map +1 -1
  68. package/lib/stores/query/DataSpaceAdvancedSearchState.js +8 -3
  69. package/lib/stores/query/DataSpaceAdvancedSearchState.js.map +1 -1
  70. package/lib/stores/query-builder/DataSpaceQueryBuilderState.d.ts +6 -1
  71. package/lib/stores/query-builder/DataSpaceQueryBuilderState.d.ts.map +1 -1
  72. package/lib/stores/query-builder/DataSpaceQueryBuilderState.js +33 -1
  73. package/lib/stores/query-builder/DataSpaceQueryBuilderState.js.map +1 -1
  74. package/package.json +11 -6
  75. package/src/components/DataSpaceDataAccess.tsx +8 -3
  76. package/src/components/DataSpaceExecutionContextViewer.tsx +231 -34
  77. package/src/components/DataSpaceLegendAIIntegration.tsx +18 -13
  78. package/src/components/DataSpaceLegendAISchema.ts +9 -7
  79. package/src/components/DataSpaceQuickStart.tsx +113 -72
  80. package/src/components/DataSpaceViewer.tsx +71 -59
  81. package/src/components/DataSpaceViewerActivityBar.tsx +10 -5
  82. package/src/components/__test-utils__/DataSpaceViewerTestUtils.ts +188 -0
  83. package/src/components/query-builder/DataSpaceQueryBuilder.tsx +11 -0
  84. package/src/components/query-builder/index.ts +1 -0
  85. package/src/graph-manager/action/analytics/DataSpaceAnalysis.ts +15 -4
  86. package/src/graph-manager/index.ts +1 -0
  87. package/src/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.ts +61 -1
  88. package/src/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_SystemModels.json +2 -2
  89. package/src/graph-manager/protocol/pure/v1/engine/analytics/V1_DataSpaceAnalysis.ts +41 -7
  90. package/src/stores/DataSpaceMappingProviderAccessState.ts +200 -0
  91. package/src/stores/DataSpaceViewerExecutableState.ts +54 -5
  92. package/src/stores/DataSpaceViewerState.ts +131 -23
  93. package/src/stores/query/DataSpaceAdvancedSearchState.ts +10 -4
  94. package/src/stores/query-builder/DataSpaceQueryBuilderState.ts +51 -0
  95. package/tsconfig.json +2 -0
@@ -54,12 +54,13 @@ import {
54
54
  } from '../stores/DataSpaceViewerNavigation.js';
55
55
  import { DataAccessOverview } from '@finos/legend-query-builder';
56
56
  import {
57
+ DataSpaceExecutableRelationResultState,
57
58
  DataSpaceExecutableTDSResultState,
58
59
  type DataSpaceViewerExecutableState,
59
60
  type ResultColumnData,
60
61
  } from '../stores/DataSpaceViewerExecutableState.js';
61
62
 
62
- enum TDS_EXECUTABLE_ACTION_TAB {
63
+ enum EXECUTABLE_ACTION_TAB {
63
64
  COLUMN_SPECS = 'COLUMN_SPECS',
64
65
  QUERY = 'QUERY',
65
66
 
@@ -102,26 +103,46 @@ const TDSColumnSampleValuesCellRenderer = (
102
103
  );
103
104
  };
104
105
 
105
- const DataSpaceExecutableTDSResultView = observer(
106
+ const TDSColumnTypeCellRenderer = (
107
+ params: DataGridCellRendererParams<ResultColumnData>,
108
+ ): React.ReactNode => {
109
+ const data = params.data;
110
+ if (!data) {
111
+ return null;
112
+ }
113
+ return data.type?.trim() ? (
114
+ data.type
115
+ ) : (
116
+ <div className="data-space__viewer__grid__empty-cell">No type provided</div>
117
+ );
118
+ };
119
+
120
+ const DataSpaceExecutableResultView = observer(
106
121
  (props: {
107
122
  executableState: DataSpaceViewerExecutableState;
108
- resultState: DataSpaceExecutableTDSResultState;
123
+ resultState:
124
+ | DataSpaceExecutableTDSResultState
125
+ | DataSpaceExecutableRelationResultState;
109
126
  }) => {
110
127
  const { executableState, resultState } = props;
111
128
  const executableAnalysisResult = executableState.value;
112
129
  const dataSpaceViewerState = executableState.viewerState;
113
130
  const applicationStore = useApplicationStore();
114
131
  const [selectedTab, setSelectedTab] = useState<string>(
115
- TDS_EXECUTABLE_ACTION_TAB.COLUMN_SPECS,
132
+ EXECUTABLE_ACTION_TAB.COLUMN_SPECS,
116
133
  );
117
134
  const queryText = executableAnalysisResult.info?.query;
118
135
  const dataAccessState =
119
136
  dataSpaceViewerState.quickStartState.dataAccessStateIndex.get(
120
137
  executableAnalysisResult,
121
138
  );
139
+ const isTDSResult =
140
+ resultState instanceof DataSpaceExecutableTDSResultState;
122
141
 
123
142
  useEffect(() => {
124
- resultState.buildSampleValues();
143
+ if (resultState instanceof DataSpaceExecutableTDSResultState) {
144
+ resultState.buildSampleValues();
145
+ }
125
146
  }, [resultState]);
126
147
 
127
148
  const openServiceQuery = (): void => {
@@ -139,22 +160,23 @@ const DataSpaceExecutableTDSResultView = observer(
139
160
  }
140
161
  };
141
162
  const columnSpecifications = resultState.gridData;
142
- const extractTDSExecutableActionConfigurations =
143
- applicationStore.pluginManager
144
- .getApplicationPlugins()
145
- .flatMap(
146
- (plugin) =>
147
- (
148
- plugin as DSL_DataSpace_LegendApplicationPlugin_Extension
149
- ).getExtraDataSpaceTDSExecutableActionConfigurations?.() ?? [],
150
- )
151
- .filter((configuration) =>
152
- configuration.isSupported(
153
- dataSpaceViewerState,
154
- executableAnalysisResult,
155
- resultState.value,
156
- ),
157
- );
163
+ const extractTDSExecutableActionConfigurations = isTDSResult
164
+ ? applicationStore.pluginManager
165
+ .getApplicationPlugins()
166
+ .flatMap(
167
+ (plugin) =>
168
+ (
169
+ plugin as DSL_DataSpace_LegendApplicationPlugin_Extension
170
+ ).getExtraDataSpaceTDSExecutableActionConfigurations?.() ?? [],
171
+ )
172
+ .filter((configuration) =>
173
+ configuration.isSupported(
174
+ dataSpaceViewerState,
175
+ executableAnalysisResult,
176
+ resultState.value,
177
+ ),
178
+ )
179
+ : [];
158
180
  const currentTabExtensionConfig =
159
181
  extractTDSExecutableActionConfigurations.find(
160
182
  (config) => config.key === selectedTab,
@@ -171,13 +193,11 @@ const DataSpaceExecutableTDSResultView = observer(
171
193
  'data-space__viewer__quickstart__item__content__tab',
172
194
  {
173
195
  'data-space__viewer__quickstart__item__content__tab--active':
174
- selectedTab === TDS_EXECUTABLE_ACTION_TAB.COLUMN_SPECS,
196
+ selectedTab === EXECUTABLE_ACTION_TAB.COLUMN_SPECS,
175
197
  },
176
198
  )}
177
199
  tabIndex={-1}
178
- onClick={() =>
179
- setSelectedTab(TDS_EXECUTABLE_ACTION_TAB.COLUMN_SPECS)
180
- }
200
+ onClick={() => setSelectedTab(EXECUTABLE_ACTION_TAB.COLUMN_SPECS)}
181
201
  >
182
202
  <div className="data-space__viewer__quickstart__item__content__tab__label">
183
203
  Column Specifications
@@ -188,11 +208,11 @@ const DataSpaceExecutableTDSResultView = observer(
188
208
  'data-space__viewer__quickstart__item__content__tab',
189
209
  {
190
210
  'data-space__viewer__quickstart__item__content__tab--active':
191
- selectedTab === TDS_EXECUTABLE_ACTION_TAB.QUERY,
211
+ selectedTab === EXECUTABLE_ACTION_TAB.QUERY,
192
212
  },
193
213
  )}
194
214
  tabIndex={-1}
195
- onClick={() => setSelectedTab(TDS_EXECUTABLE_ACTION_TAB.QUERY)}
215
+ onClick={() => setSelectedTab(EXECUTABLE_ACTION_TAB.QUERY)}
196
216
  >
197
217
  <div className="data-space__viewer__quickstart__item__content__tab__icon">
198
218
  <LegendLogo className="data-space__viewer__quickstart__item__content__tab__icon--query" />
@@ -201,6 +221,26 @@ const DataSpaceExecutableTDSResultView = observer(
201
221
  Query
202
222
  </div>
203
223
  </button>
224
+ {queryText !== undefined && (
225
+ <button
226
+ className={clsx(
227
+ 'data-space__viewer__quickstart__item__content__tab',
228
+ {
229
+ 'data-space__viewer__quickstart__item__content__tab--active':
230
+ selectedTab === EXECUTABLE_ACTION_TAB.QUERY_TEXT,
231
+ },
232
+ )}
233
+ tabIndex={-1}
234
+ onClick={() => setSelectedTab(EXECUTABLE_ACTION_TAB.QUERY_TEXT)}
235
+ >
236
+ <div className="data-space__viewer__quickstart__item__content__tab__icon">
237
+ <CodeIcon className="data-space__viewer__quickstart__item__content__tab__icon--query" />
238
+ </div>
239
+ <div className="data-space__viewer__quickstart__item__content__tab__label">
240
+ Grammar
241
+ </div>
242
+ </button>
243
+ )}
204
244
  {extractTDSExecutableActionConfigurations.map((config) => (
205
245
  <button
206
246
  key={config.key}
@@ -237,14 +277,12 @@ const DataSpaceExecutableTDSResultView = observer(
237
277
  'data-space__viewer__quickstart__item__content__tab',
238
278
  {
239
279
  'data-space__viewer__quickstart__item__content__tab--active':
240
- selectedTab === TDS_EXECUTABLE_ACTION_TAB.DATA_ACCESS,
280
+ selectedTab === EXECUTABLE_ACTION_TAB.DATA_ACCESS,
241
281
  },
242
282
  )}
243
283
  tabIndex={-1}
244
284
  title="Data Access"
245
- onClick={() =>
246
- setSelectedTab(TDS_EXECUTABLE_ACTION_TAB.DATA_ACCESS)
247
- }
285
+ onClick={() => setSelectedTab(EXECUTABLE_ACTION_TAB.DATA_ACCESS)}
248
286
  >
249
287
  <div className="data-space__viewer__quickstart__item__content__tab__icon">
250
288
  <DataAccessIcon />
@@ -258,43 +296,21 @@ const DataSpaceExecutableTDSResultView = observer(
258
296
  'data-space__viewer__quickstart__item__content__tab',
259
297
  {
260
298
  'data-space__viewer__quickstart__item__content__tab--active':
261
- selectedTab === TDS_EXECUTABLE_ACTION_TAB.USAGE_STATS,
299
+ selectedTab === EXECUTABLE_ACTION_TAB.USAGE_STATS,
262
300
  },
263
301
  )}
264
302
  tabIndex={-1}
265
303
  title="Usage Statistics"
266
- onClick={() =>
267
- setSelectedTab(TDS_EXECUTABLE_ACTION_TAB.USAGE_STATS)
268
- }
304
+ onClick={() => setSelectedTab(EXECUTABLE_ACTION_TAB.USAGE_STATS)}
269
305
  >
270
306
  <div className="data-space__viewer__quickstart__item__content__tab__icon">
271
307
  <StatisticsIcon />
272
308
  </div>
273
309
  </button>
274
- {queryText !== undefined && (
275
- <button
276
- className={clsx(
277
- 'data-space__viewer__quickstart__item__content__tab',
278
- {
279
- 'data-space__viewer__quickstart__item__content__tab--active':
280
- selectedTab === TDS_EXECUTABLE_ACTION_TAB.QUERY_TEXT,
281
- },
282
- )}
283
- tabIndex={-1}
284
- title="Pure Query"
285
- onClick={() =>
286
- setSelectedTab(TDS_EXECUTABLE_ACTION_TAB.QUERY_TEXT)
287
- }
288
- >
289
- <div className="data-space__viewer__quickstart__item__content__tab__icon">
290
- <CodeIcon className="data-space__viewer__quickstart__item__content__tab__icon--query" />
291
- </div>
292
- </button>
293
- )}
294
310
  </div>
295
311
  </div>
296
312
  <div className="data-space__viewer__quickstart__item__content__tab__content">
297
- {selectedTab === TDS_EXECUTABLE_ACTION_TAB.COLUMN_SPECS && (
313
+ {selectedTab === EXECUTABLE_ACTION_TAB.COLUMN_SPECS && (
298
314
  <div
299
315
  className={clsx(
300
316
  'data-space__viewer__quickstart__tds__column-specs',
@@ -326,6 +342,14 @@ const DataSpaceExecutableTDSResultView = observer(
326
342
  }`,
327
343
  flex: 1,
328
344
  },
345
+ {
346
+ minWidth: 50,
347
+ sortable: false,
348
+ resizable: true,
349
+ cellRenderer: TDSColumnTypeCellRenderer,
350
+ headerName: 'Type',
351
+ flex: 1,
352
+ },
329
353
  {
330
354
  minWidth: 50,
331
355
  sortable: false,
@@ -352,7 +376,7 @@ const DataSpaceExecutableTDSResultView = observer(
352
376
  />
353
377
  </div>
354
378
  )}
355
- {selectedTab === TDS_EXECUTABLE_ACTION_TAB.QUERY && (
379
+ {selectedTab === EXECUTABLE_ACTION_TAB.QUERY && (
356
380
  <div className="data-space__viewer__quickstart__tds__query">
357
381
  <div className="data-space__viewer__quickstart__tds__query__actions">
358
382
  <button
@@ -372,7 +396,7 @@ const DataSpaceExecutableTDSResultView = observer(
372
396
  </div>
373
397
  </div>
374
398
  )}
375
- {selectedTab === TDS_EXECUTABLE_ACTION_TAB.DATA_ACCESS &&
399
+ {selectedTab === EXECUTABLE_ACTION_TAB.DATA_ACCESS &&
376
400
  (dataAccessState ? (
377
401
  <DataAccessOverview
378
402
  dataAccessState={dataAccessState}
@@ -385,14 +409,14 @@ const DataSpaceExecutableTDSResultView = observer(
385
409
  </BlankPanelContent>
386
410
  </div>
387
411
  ))}
388
- {selectedTab === TDS_EXECUTABLE_ACTION_TAB.USAGE_STATS && (
412
+ {selectedTab === EXECUTABLE_ACTION_TAB.USAGE_STATS && (
389
413
  <div className="data-space__viewer__quickstart__tds__placeholder-panel">
390
414
  <BlankPanelContent>
391
415
  Usage Statistics (Work in Progress)
392
416
  </BlankPanelContent>
393
417
  </div>
394
418
  )}
395
- {selectedTab === TDS_EXECUTABLE_ACTION_TAB.QUERY_TEXT &&
419
+ {selectedTab === EXECUTABLE_ACTION_TAB.QUERY_TEXT &&
396
420
  queryText !== undefined && (
397
421
  <div className="data-space__viewer__quickstart__tds__query-text">
398
422
  <div className="data-space__viewer__quickstart__tds__query-text__content">
@@ -427,11 +451,12 @@ const DataSpaceExecutableTDSResultView = observer(
427
451
  </div>
428
452
  </div>
429
453
  )}
430
- {currentTabExtensionConfig?.renderer(
431
- dataSpaceViewerState,
432
- executableAnalysisResult,
433
- resultState.value,
434
- )}
454
+ {resultState instanceof DataSpaceExecutableTDSResultState &&
455
+ currentTabExtensionConfig?.renderer(
456
+ dataSpaceViewerState,
457
+ executableAnalysisResult,
458
+ resultState.value,
459
+ )}
435
460
  </div>
436
461
  </div>
437
462
  );
@@ -456,6 +481,23 @@ const DataSpaceExecutableAnalysisResultView = observer(
456
481
  return () => dataSpaceViewerState.layoutState.unsetWikiPageAnchor(anchor);
457
482
  }, [dataSpaceViewerState, anchor]);
458
483
 
484
+ const executableTypeLabel = ((): string => {
485
+ if (
486
+ executableState.resultState instanceof
487
+ DataSpaceExecutableRelationResultState
488
+ ) {
489
+ return 'Relation';
490
+ }
491
+ if (
492
+ executableAnalysisResult.result instanceof DataSpaceExecutableTDSResult
493
+ ) {
494
+ return 'TDS';
495
+ }
496
+ return (
497
+ executableAnalysisResult.executableReturnType?.rawType.name ?? 'UNKNOWN'
498
+ );
499
+ })();
500
+
459
501
  return (
460
502
  <div ref={quickStartRef} className="data-space__viewer__quickstart__item">
461
503
  <div className="data-space__viewer__quickstart__item__header">
@@ -463,10 +505,7 @@ const DataSpaceExecutableAnalysisResultView = observer(
463
505
  {executableAnalysisResult.title}
464
506
  </div>
465
507
  <div className="data-space__viewer__quickstart__item__header__type">
466
- {executableAnalysisResult.result instanceof
467
- DataSpaceExecutableTDSResult
468
- ? 'TDS'
469
- : 'UNKNOWN'}
508
+ {executableTypeLabel}
470
509
  </div>
471
510
  <button
472
511
  className="data-space__viewer__quickstart__item__header__anchor"
@@ -483,9 +522,11 @@ const DataSpaceExecutableAnalysisResultView = observer(
483
522
  />
484
523
  </div>
485
524
  )}
486
- {executableState.resultState instanceof
487
- DataSpaceExecutableTDSResultState && (
488
- <DataSpaceExecutableTDSResultView
525
+ {(executableState.resultState instanceof
526
+ DataSpaceExecutableTDSResultState ||
527
+ executableState.resultState instanceof
528
+ DataSpaceExecutableRelationResultState) && (
529
+ <DataSpaceExecutableResultView
489
530
  executableState={executableState}
490
531
  resultState={executableState.resultState}
491
532
  />
@@ -44,6 +44,7 @@ import { DataSpacePlaceholderPanel } from './DataSpacePlaceholder.js';
44
44
  import { useApplicationStore } from '@finos/legend-application';
45
45
  import { DataSpaceLegendAIIntegration } from './DataSpaceLegendAIIntegration.js';
46
46
  import { DSL_DATASPACE_EVENT } from '../__lib__/DSL_DataSpace_Event.js';
47
+ import { guaranteeNonNullable } from '@finos/legend-shared';
47
48
 
48
49
  const DataSpaceHeader = observer(
49
50
  (props: {
@@ -91,51 +92,55 @@ const DataSpaceHeader = observer(
91
92
  )}
92
93
  </div>
93
94
  <div className="data-space__viewer__header__actions">
94
- <ControlledDropdownMenu
95
- className="data-space__viewer__header__execution-context-selector"
96
- menuProps={{
97
- anchorOrigin: { vertical: 'bottom', horizontal: 'center' },
98
- transformOrigin: { vertical: 'top', horizontal: 'center' },
99
- elevation: 7,
100
- }}
101
- title={`Current Execution Context: ${dataSpaceViewerState.currentExecutionContext.name}\nClick to switch`}
102
- content={
103
- <MenuContent>
104
- {Array.from(
105
- dataSpaceViewerState.dataSpaceAnalysisResult.executionContextsIndex.values(),
106
- ).map((context) => (
107
- <MenuContentItem
108
- key={context.name}
109
- className={clsx(
110
- 'data-space__viewer__header__execution-context-selector__option',
111
- {
112
- 'data-space__viewer__header__execution-context-selector__option--active':
113
- context ===
114
- dataSpaceViewerState.currentExecutionContext,
115
- },
116
- )}
117
- onClick={() =>
118
- dataSpaceViewerState.setCurrentExecutionContext(context)
119
- }
120
- >
121
- {context.name}
122
- </MenuContentItem>
123
- ))}
124
- </MenuContent>
125
- }
126
- >
127
- <div className="data-space__viewer__header__execution-context-selector__trigger">
128
- <div className="data-space__viewer__header__execution-context-selector__trigger__icon">
129
- <PlayIcon />
130
- </div>
131
- <div className="data-space__viewer__header__execution-context-selector__trigger__label">
132
- {dataSpaceViewerState.currentExecutionContext.name}
133
- </div>
134
- <div className="data-space__viewer__header__execution-context-selector__trigger__dropdown-icon">
135
- <CaretDownIcon />
95
+ {dataSpaceViewerState.currentExecutionContext && (
96
+ <ControlledDropdownMenu
97
+ className="data-space__viewer__header__execution-context-selector"
98
+ menuProps={{
99
+ anchorOrigin: { vertical: 'bottom', horizontal: 'center' },
100
+ transformOrigin: { vertical: 'top', horizontal: 'center' },
101
+ elevation: 7,
102
+ }}
103
+ title={`Current Execution Context: ${dataSpaceViewerState.currentExecutionContext.name}\nClick to switch`}
104
+ content={
105
+ <MenuContent>
106
+ {Array.from(
107
+ dataSpaceViewerState.dataSpaceAnalysisResult.executionContextsIndex.values(),
108
+ ).map((context) => (
109
+ <MenuContentItem
110
+ key={context.name}
111
+ className={clsx(
112
+ 'data-space__viewer__header__execution-context-selector__option',
113
+ {
114
+ 'data-space__viewer__header__execution-context-selector__option--active':
115
+ context ===
116
+ dataSpaceViewerState.currentExecutionContext,
117
+ },
118
+ )}
119
+ onClick={() =>
120
+ dataSpaceViewerState.setCurrentExecutionContext(
121
+ context,
122
+ )
123
+ }
124
+ >
125
+ {context.name}
126
+ </MenuContentItem>
127
+ ))}
128
+ </MenuContent>
129
+ }
130
+ >
131
+ <div className="data-space__viewer__header__execution-context-selector__trigger">
132
+ <div className="data-space__viewer__header__execution-context-selector__trigger__icon">
133
+ <PlayIcon />
134
+ </div>
135
+ <div className="data-space__viewer__header__execution-context-selector__trigger__label">
136
+ {dataSpaceViewerState.currentExecutionContext.name}
137
+ </div>
138
+ <div className="data-space__viewer__header__execution-context-selector__trigger__dropdown-icon">
139
+ <CaretDownIcon />
140
+ </div>
136
141
  </div>
137
- </div>
138
- </ControlledDropdownMenu>
142
+ </ControlledDropdownMenu>
143
+ )}
139
144
  <ControlledDropdownMenu
140
145
  className="data-space__viewer__header__actions-selector"
141
146
  menuProps={{
@@ -146,16 +151,22 @@ const DataSpaceHeader = observer(
146
151
  title="More Actions..."
147
152
  content={
148
153
  <MenuContent>
149
- <MenuContentItem
150
- onClick={() =>
151
- dataSpaceViewerState.queryDataSpace(
152
- dataSpaceViewerState.currentExecutionContext.name,
153
- )
154
- }
155
- >
156
- Query Data Product
157
- </MenuContentItem>
158
- <MenuContentDivider />
154
+ {dataSpaceViewerState.currentExecutionContext && (
155
+ <>
156
+ <MenuContentItem
157
+ onClick={() =>
158
+ dataSpaceViewerState.queryDataSpace(
159
+ guaranteeNonNullable(
160
+ dataSpaceViewerState.currentExecutionContext,
161
+ ).name,
162
+ )
163
+ }
164
+ >
165
+ Query Data Product
166
+ </MenuContentItem>
167
+ <MenuContentDivider />
168
+ </>
169
+ )}
159
170
  <MenuContentItem
160
171
  onClick={() =>
161
172
  dataSpaceViewerState.viewProject(analysisResult.path)
@@ -348,11 +359,12 @@ export const DataSpaceViewer = observer(
348
359
  <DataSpaceWiki dataSpaceViewerState={dataSpaceViewerState} />
349
360
  )}
350
361
  {dataSpaceViewerState.currentActivity ===
351
- DATA_SPACE_VIEWER_ACTIVITY_MODE.EXECUTION_CONTEXT && (
352
- <DataSpaceExecutionContextViewer
353
- dataSpaceViewerState={dataSpaceViewerState}
354
- />
355
- )}
362
+ DATA_SPACE_VIEWER_ACTIVITY_MODE.EXECUTION_CONTEXT &&
363
+ dataSpaceViewerState.currentExecutionContext && (
364
+ <DataSpaceExecutionContextViewer
365
+ dataSpaceViewerState={dataSpaceViewerState}
366
+ />
367
+ )}
356
368
  {dataSpaceViewerState.currentActivity ===
357
369
  DATA_SPACE_VIEWER_ACTIVITY_MODE.DATA_STORES && (
358
370
  <DataSpacePlaceholderPanel
@@ -136,11 +136,16 @@ export const DataSpaceViewerActivityBar = observer(
136
136
  ];
137
137
 
138
138
  const activities: ActivityBarItemConfig[] = [
139
- {
140
- mode: DATA_SPACE_VIEWER_ACTIVITY_MODE.EXECUTION_CONTEXT,
141
- title: 'Execution Context',
142
- icon: <PlayIcon />,
143
- },
139
+ ...(dataSpaceViewerState.dataSpaceAnalysisResult.executionContextsIndex
140
+ .size > 0
141
+ ? [
142
+ {
143
+ mode: DATA_SPACE_VIEWER_ACTIVITY_MODE.EXECUTION_CONTEXT,
144
+ title: 'Execution Context',
145
+ icon: <PlayIcon />,
146
+ },
147
+ ]
148
+ : []),
144
149
  {
145
150
  mode: DATA_SPACE_VIEWER_ACTIVITY_MODE.DATA_STORES,
146
151
  title: 'Data Stores (Work In Progress)',