@finos/legend-application-studio 28.18.73 → 28.18.75

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 (67) hide show
  1. package/lib/__lib__/LegendStudioNavigation.d.ts.map +1 -1
  2. package/lib/__lib__/LegendStudioNavigation.js +0 -18
  3. package/lib/__lib__/LegendStudioNavigation.js.map +1 -1
  4. package/lib/components/editor/Editor.d.ts.map +1 -1
  5. package/lib/components/editor/Editor.js +1 -1
  6. package/lib/components/editor/Editor.js.map +1 -1
  7. package/lib/components/editor/editor-group/function-activator/FunctionEditor.js +1 -1
  8. package/lib/components/editor/editor-group/function-activator/FunctionEditor.js.map +1 -1
  9. package/lib/components/editor/editor-group/service-editor/ServiceEditor.d.ts.map +1 -1
  10. package/lib/components/editor/editor-group/service-editor/ServiceEditor.js +1 -1
  11. package/lib/components/editor/editor-group/service-editor/ServiceEditor.js.map +1 -1
  12. package/lib/components/editor/editor-group/service-editor/ServiceExecutionQueryEditor.js +1 -1
  13. package/lib/components/editor/editor-group/service-editor/ServiceExecutionQueryEditor.js.map +1 -1
  14. package/lib/components/editor/panel-group/DevToolPanel.js +1 -1
  15. package/lib/components/editor/side-bar/Explorer.js +1 -1
  16. package/lib/components/editor/side-bar/Explorer.js.map +1 -1
  17. package/lib/components/project-reviewer/ProjectReviewStoreProvider.d.ts +2 -2
  18. package/lib/components/project-reviewer/ProjectReviewStoreProvider.d.ts.map +1 -1
  19. package/lib/components/project-reviewer/ProjectReviewStoreProvider.js +2 -1
  20. package/lib/components/project-reviewer/ProjectReviewStoreProvider.js.map +1 -1
  21. package/lib/components/showcase/ShowcaseViewer.d.ts.map +1 -1
  22. package/lib/components/showcase/ShowcaseViewer.js +1 -1
  23. package/lib/components/showcase/ShowcaseViewer.js.map +1 -1
  24. package/lib/index.css +1 -1
  25. package/lib/package.json +3 -2
  26. package/lib/stores/LegendStudioBaseStore.d.ts.map +1 -1
  27. package/lib/stores/LegendStudioBaseStore.js +3 -2
  28. package/lib/stores/LegendStudioBaseStore.js.map +1 -1
  29. package/lib/stores/editor/EditorGraphState.d.ts.map +1 -1
  30. package/lib/stores/editor/EditorGraphState.js +1 -0
  31. package/lib/stores/editor/EditorGraphState.js.map +1 -1
  32. package/lib/stores/editor/EditorStore.d.ts +3 -3
  33. package/lib/stores/editor/EditorStore.d.ts.map +1 -1
  34. package/lib/stores/editor/EditorStore.js +5 -4
  35. package/lib/stores/editor/EditorStore.js.map +1 -1
  36. package/lib/stores/editor/data-cube/{DataCubeViewerState.d.ts → LegendStudioDataCubeHelper.d.ts} +1 -1
  37. package/lib/stores/editor/data-cube/LegendStudioDataCubeHelper.d.ts.map +1 -0
  38. package/lib/stores/editor/data-cube/{DataCubeViewerState.js → LegendStudioDataCubeHelper.js} +8 -4
  39. package/lib/stores/editor/data-cube/LegendStudioDataCubeHelper.js.map +1 -0
  40. package/lib/stores/editor/editor-state/element-editor-state/service/ServiceExecutionState.js +1 -1
  41. package/lib/stores/editor/editor-state/element-editor-state/service/ServiceExecutionState.js.map +1 -1
  42. package/lib/stores/project-view/ProjectViewerStore.d.ts.map +1 -1
  43. package/lib/stores/project-view/ProjectViewerStore.js +1 -0
  44. package/lib/stores/project-view/ProjectViewerStore.js.map +1 -1
  45. package/lib/stores/showcase/ShowcaseViewerStore.d.ts.map +1 -1
  46. package/lib/stores/showcase/ShowcaseViewerStore.js +1 -0
  47. package/lib/stores/showcase/ShowcaseViewerStore.js.map +1 -1
  48. package/package.json +14 -13
  49. package/src/__lib__/LegendStudioNavigation.ts +1 -19
  50. package/src/components/editor/Editor.tsx +5 -3
  51. package/src/components/editor/editor-group/function-activator/FunctionEditor.tsx +1 -1
  52. package/src/components/editor/editor-group/service-editor/ServiceEditor.tsx +1 -2
  53. package/src/components/editor/editor-group/service-editor/ServiceExecutionQueryEditor.tsx +1 -1
  54. package/src/components/editor/panel-group/DevToolPanel.tsx +1 -1
  55. package/src/components/editor/side-bar/Explorer.tsx +1 -1
  56. package/src/components/project-reviewer/ProjectReviewStoreProvider.tsx +3 -4
  57. package/src/components/showcase/ShowcaseViewer.tsx +5 -3
  58. package/src/stores/LegendStudioBaseStore.ts +3 -3
  59. package/src/stores/editor/EditorGraphState.ts +4 -0
  60. package/src/stores/editor/EditorStore.ts +9 -5
  61. package/src/stores/editor/data-cube/{DataCubeViewerState.ts → LegendStudioDataCubeHelper.ts} +15 -3
  62. package/src/stores/editor/editor-state/element-editor-state/service/ServiceExecutionState.ts +1 -1
  63. package/src/stores/project-view/ProjectViewerStore.ts +4 -0
  64. package/src/stores/showcase/ShowcaseViewerStore.ts +4 -0
  65. package/tsconfig.json +1 -1
  66. package/lib/stores/editor/data-cube/DataCubeViewerState.d.ts.map +0 -1
  67. package/lib/stores/editor/data-cube/DataCubeViewerState.js.map +0 -1
@@ -526,8 +526,7 @@ const ServiceGeneralEditor = observer(() => {
526
526
  >
527
527
  <ErrorIcon />
528
528
  <div className="service-editor__owner__validation-label">
529
- Service requires at least {MINIMUM_SERVICE_OWNERS}{' '}
530
- owners
529
+ {`Service requires at least ${MINIMUM_SERVICE_OWNERS} owners`}
531
530
  </div>
532
531
  </div>
533
532
  )}
@@ -69,7 +69,7 @@ import { EXTERNAL_APPLICATION_NAVIGATION__generateServiceQueryCreatorUrl } from
69
69
  import type { EditorStore } from '../../../../stores/editor/EditorStore.js';
70
70
  import { pureExecution_setFunction } from '../../../../stores/graph-modifier/DSL_Service_GraphModifierHelper.js';
71
71
  import { ServiceEditorState } from '../../../../stores/editor/editor-state/element-editor-state/service/ServiceEditorState.js';
72
- import { openDataCube } from '../../../../stores/editor/data-cube/DataCubeViewerState.js';
72
+ import { openDataCube } from '../../../../stores/editor/data-cube/LegendStudioDataCubeHelper.js';
73
73
 
74
74
  const ServiceExecutionResultViewer = observer(
75
75
  (props: { executionState: ServicePureExecutionState }) => {
@@ -154,7 +154,7 @@ export const DevToolPanel = observer(() => {
154
154
  />
155
155
  <PanelFormBooleanField
156
156
  name="Use Dev client protocol version"
157
- prompt="Specifies if development client porotocl (v_X_X_X) version should be used for execution"
157
+ prompt="Specifies if development client protocol (v_X_X_X) version should be used for execution"
158
158
  value={engineConfig.useDevClientProtocol}
159
159
  isReadOnly={false}
160
160
  update={toggleSetUseDevClientProtocol}
@@ -147,7 +147,7 @@ import { QueryDatabaseState } from '../../../stores/editor/editor-state/element-
147
147
  import {
148
148
  isElementSupportedByDataCube,
149
149
  openDataCube,
150
- } from '../../../stores/editor/data-cube/DataCubeViewerState.js';
150
+ } from '../../../stores/editor/data-cube/LegendStudioDataCubeHelper.js';
151
151
 
152
152
  const ElementRenamer = observer(() => {
153
153
  const editorStore = useEditorStore();
@@ -25,11 +25,10 @@ const ProjectReviewerStoreContext = createContext<
25
25
  ProjectReviewerStore | undefined
26
26
  >(undefined);
27
27
 
28
- export const ProjectReviewerStoreProvider = ({
29
- children,
30
- }: {
28
+ export const ProjectReviewerStoreProvider = (props: {
31
29
  children: React.ReactNode;
32
- }): React.ReactElement => {
30
+ }) => {
31
+ const { children } = props;
33
32
  const editorStore = useEditorStore();
34
33
  editorStore.setMode(EDITOR_MODE.REVIEW);
35
34
  const store = useLocalObservable(() => new ProjectReviewerStore(editorStore));
@@ -410,10 +410,12 @@ export const ShowcaseViewer = withEditorStore(
410
410
  )}
411
411
  <ShowcaseViewerStatusBar />
412
412
  <EmbeddedQueryBuilder />
413
- {editorStore.embeddedDataCubeViewerEngine && (
413
+ {editorStore.embeddedDataCubeViewerState && (
414
414
  <QueryDataCubeViewer
415
- engine={editorStore.embeddedDataCubeViewerEngine}
416
- close={() => editorStore.setDataCubeViewState(undefined)}
415
+ state={editorStore.embeddedDataCubeViewerState}
416
+ close={() =>
417
+ editorStore.setEmbeddedDataCubeViewerState(undefined)
418
+ }
417
419
  options={{
418
420
  fullScreen: true,
419
421
  }}
@@ -22,7 +22,6 @@ import {
22
22
  ActionState,
23
23
  LogEvent,
24
24
  assertErrorThrown,
25
- NetworkClient,
26
25
  } from '@finos/legend-shared';
27
26
  import {
28
27
  type ApplicationStore,
@@ -48,6 +47,7 @@ import type { LegendStudioApplicationConfig } from '../application/LegendStudioA
48
47
  import { LegendStudioEventHelper } from '../__lib__/LegendStudioEventHelper.js';
49
48
  import { LEGEND_STUDIO_SDLC_BYPASSED_ROUTE_PATTERN } from '../__lib__/LegendStudioNavigation.js';
50
49
  import { ShowcaseManagerState } from './ShowcaseManagerState.js';
50
+ import { getCurrentUserIDFromEngineServer } from '@finos/legend-graph';
51
51
 
52
52
  export type LegendStudioApplicationStore = ApplicationStore<
53
53
  LegendStudioApplicationConfig,
@@ -168,8 +168,8 @@ export class LegendStudioBaseStore {
168
168
  if (this.applicationStore.identityService.isAnonymous) {
169
169
  try {
170
170
  this.applicationStore.identityService.setCurrentUser(
171
- (yield new NetworkClient().get(
172
- `${this.applicationStore.config.engineServerUrl}/server/v1/currentUser`,
171
+ (yield getCurrentUserIDFromEngineServer(
172
+ this.applicationStore.config.engineServerUrl,
173
173
  )) as string,
174
174
  );
175
175
  } catch (error) {
@@ -453,6 +453,10 @@ export class EditorGraphState {
453
453
  this.editorStore.applicationStore.notificationService.notifyError(
454
454
  `Can't build graph. Redirected to text mode for debugging. Error: ${error.message}`,
455
455
  );
456
+ this.editorStore.applicationStore.logService.error(
457
+ LogEvent.create(GRAPH_MANAGER_EVENT.GRAPH_BUILDER_FAILURE),
458
+ error,
459
+ );
456
460
  try {
457
461
  yield flowResult(
458
462
  this.editorStore.switchModes(GRAPH_EDITOR_MODE.GRAMMAR_TEXT, {
@@ -117,7 +117,7 @@ import {
117
117
  GraphEditLazyGrammarModeState,
118
118
  LazyTextEditorStore,
119
119
  } from '../lazy-text-editor/LazyTextEditorStore.js';
120
- import type { QueryBuilderDataCubeEngine } from '@finos/legend-query-builder';
120
+ import type { QueryBuilderDataCubeViewerState } from '@finos/legend-query-builder';
121
121
 
122
122
  export abstract class EditorExtensionState {
123
123
  /**
@@ -179,7 +179,7 @@ export class EditorStore implements CommandRegistrar {
179
179
  modelImporterState: ModelImporterState;
180
180
  projectConfigurationEditorState: ProjectConfigurationEditorState;
181
181
  embeddedQueryBuilderState: EmbeddedQueryBuilderState;
182
- embeddedDataCubeViewerEngine: QueryBuilderDataCubeEngine | undefined;
182
+ embeddedDataCubeViewerState: QueryBuilderDataCubeViewerState | undefined;
183
183
  newElementState: NewElementState;
184
184
  /**
185
185
  * Since we want to share element generation state across all element in the editor, we will create 1 element generate state
@@ -225,7 +225,6 @@ export class EditorStore implements CommandRegistrar {
225
225
  showSearchElementCommand: observable,
226
226
  quickInputState: observable,
227
227
  lazyTextEditorStore: observable,
228
- embeddedDataCubeViewerEngine: observable,
229
228
 
230
229
  isInViewerMode: computed,
231
230
  disableGraphEditing: computed,
@@ -250,6 +249,9 @@ export class EditorStore implements CommandRegistrar {
250
249
  buildGraph: flow,
251
250
  toggleTextMode: flow,
252
251
  switchModes: flow,
252
+
253
+ embeddedDataCubeViewerState: observable,
254
+ setEmbeddedDataCubeViewerState: action,
253
255
  });
254
256
 
255
257
  this.applicationStore = applicationStore;
@@ -377,8 +379,10 @@ export class EditorStore implements CommandRegistrar {
377
379
  this.showSearchElementCommand = val;
378
380
  }
379
381
 
380
- setDataCubeViewState(val: QueryBuilderDataCubeEngine | undefined): void {
381
- this.embeddedDataCubeViewerEngine = val;
382
+ setEmbeddedDataCubeViewerState(
383
+ val: QueryBuilderDataCubeViewerState | undefined,
384
+ ): void {
385
+ this.embeddedDataCubeViewerState = val;
382
386
  }
383
387
 
384
388
  setQuickInputState<T>(val: QuickInputState<T> | undefined): void {
@@ -26,13 +26,17 @@ import {
26
26
  Service,
27
27
  } from '@finos/legend-graph';
28
28
  import type { EditorStore } from '../EditorStore.js';
29
- import { QueryBuilderDataCubeEngine } from '@finos/legend-query-builder';
29
+ import {
30
+ QueryBuilderDataCubeEngine,
31
+ QueryBuilderDataCubeViewerState,
32
+ } from '@finos/legend-query-builder';
30
33
  import {
31
34
  assertErrorThrown,
32
35
  guaranteeNonNullable,
33
36
  guaranteeType,
34
37
  UnsupportedOperationError,
35
38
  } from '@finos/legend-shared';
39
+ import { type DataCubeQuery } from '@finos/legend-data-cube';
36
40
 
37
41
  export const isElementSupportedByDataCube = (
38
42
  element: PackageableElement,
@@ -44,7 +48,9 @@ export const openDataCube = async (
44
48
  editorStore: EditorStore,
45
49
  ): Promise<void> => {
46
50
  try {
51
+ let query: DataCubeQuery;
47
52
  let engine: QueryBuilderDataCubeEngine;
53
+
48
54
  if (element instanceof ConcreteFunctionDefinition) {
49
55
  const body = element.expressionSequence;
50
56
  const rawLambda = new RawLambda([], body);
@@ -55,6 +61,7 @@ export const openDataCube = async (
55
61
  undefined,
56
62
  editorStore.graphManagerState,
57
63
  );
64
+ query = await engine.generateInitialQuery();
58
65
  } else if (element instanceof Service) {
59
66
  const exec = guaranteeType(
60
67
  element.execution,
@@ -92,20 +99,25 @@ export const openDataCube = async (
92
99
  runtime?.packageableRuntime.value.path,
93
100
  editorStore.graphManagerState,
94
101
  );
102
+ query = await engine.generateInitialQuery();
95
103
  } else {
96
104
  throw new UnsupportedOperationError(
97
105
  'Element not supported to open Data Cube with',
98
106
  );
99
107
  }
108
+
100
109
  try {
101
- await engine.getRelationalType(engine.selectInitialQuery);
110
+ await engine.getRelationType(engine.selectInitialQuery);
102
111
  } catch (error) {
103
112
  assertErrorThrown(error);
104
113
  throw new UnsupportedOperationError(
105
114
  'Only relation type queries supported in Data Cube',
106
115
  );
107
116
  }
108
- editorStore.setDataCubeViewState(engine);
117
+
118
+ editorStore.setEmbeddedDataCubeViewerState(
119
+ new QueryBuilderDataCubeViewerState(query, engine),
120
+ );
109
121
  } catch (error) {
110
122
  assertErrorThrown(error);
111
123
  editorStore.applicationStore.notificationService.notifyError(
@@ -221,7 +221,7 @@ export class ServicePureExecutionQueryState extends LambdaEditorState {
221
221
  this.execution = execution;
222
222
  this.queryLoaderState = new QueryLoaderState(
223
223
  editorStore.applicationStore,
224
- editorStore.graphManagerState,
224
+ editorStore.graphManagerState.graphManager,
225
225
  {
226
226
  loadQuery: (query: LightQuery): void => {
227
227
  flowResult(this.importQuery(query.id)).catch(
@@ -479,6 +479,10 @@ export class ProjectViewerStore {
479
479
  this.editorStore.applicationStore.notificationService.notifyError(
480
480
  `Can't build graph. Redirected to text mode for debugging. Error: ${error.message}`,
481
481
  );
482
+ this.editorStore.applicationStore.logService.error(
483
+ LogEvent.create(GRAPH_MANAGER_EVENT.GRAPH_BUILDER_FAILURE),
484
+ error,
485
+ );
482
486
  yield flowResult(
483
487
  this.editorStore.switchModes(GRAPH_EDITOR_MODE.GRAMMAR_TEXT, {
484
488
  isGraphBuildFailure: true,
@@ -270,6 +270,10 @@ export class ShowcaseViewerStore {
270
270
  this.editorStore.applicationStore.notificationService.notifyError(
271
271
  `Can't build graph. Redirected to text mode for debugging. Error: ${error.message}`,
272
272
  );
273
+ this.editorStore.applicationStore.logService.error(
274
+ LogEvent.create(GRAPH_MANAGER_EVENT.GRAPH_BUILDER_FAILURE),
275
+ error,
276
+ );
273
277
  yield flowResult(
274
278
  this.editorStore.switchModes(GRAPH_EDITOR_MODE.GRAMMAR_TEXT, {
275
279
  isGraphBuildFailure: true,
package/tsconfig.json CHANGED
@@ -93,7 +93,7 @@
93
93
  "./src/stores/editor/QuickInputState.ts",
94
94
  "./src/stores/editor/StandardEditorMode.ts",
95
95
  "./src/stores/editor/__test-utils__/EditorStoreTestUtils.ts",
96
- "./src/stores/editor/data-cube/DataCubeViewerState.ts",
96
+ "./src/stores/editor/data-cube/LegendStudioDataCubeHelper.ts",
97
97
  "./src/stores/editor/editor-state/ArtifactGenerationViewerState.ts",
98
98
  "./src/stores/editor/editor-state/EditorState.ts",
99
99
  "./src/stores/editor/editor-state/ExternalFormatState.ts",
@@ -1 +0,0 @@
1
- {"version":3,"file":"DataCubeViewerState.d.ts","sourceRoot":"","sources":["../../../../src/stores/editor/data-cube/DataCubeViewerState.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAGL,KAAK,kBAAkB,EAOxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AASrD,eAAO,MAAM,4BAA4B,YAC9B,kBAAkB,KAC1B,OAC0E,CAAC;AAE9E,eAAO,MAAM,YAAY,YACd,kBAAkB,eACd,WAAW,KACvB,OAAO,CAAC,IAAI,CAsEd,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"DataCubeViewerState.js","sourceRoot":"","sources":["../../../../src/stores/editor/data-cube/DataCubeViewerState.ts"],"names":[],"mappings":"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"}