@finos/legend-extension-dsl-data-space-studio 0.1.0

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 (53) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +3 -0
  3. package/lib/__lib__/DSL_DataSpace_LegendStudioCodeSnippet.d.ts +17 -0
  4. package/lib/__lib__/DSL_DataSpace_LegendStudioCodeSnippet.d.ts.map +1 -0
  5. package/lib/__lib__/DSL_DataSpace_LegendStudioCodeSnippet.js +54 -0
  6. package/lib/__lib__/DSL_DataSpace_LegendStudioCodeSnippet.js.map +1 -0
  7. package/lib/__lib__/DSL_DataSpace_LegendStudioDocumentation.d.ts +21 -0
  8. package/lib/__lib__/DSL_DataSpace_LegendStudioDocumentation.d.ts.map +1 -0
  9. package/lib/__lib__/DSL_DataSpace_LegendStudioDocumentation.js +22 -0
  10. package/lib/__lib__/DSL_DataSpace_LegendStudioDocumentation.js.map +1 -0
  11. package/lib/components/DSL_DataSpace_LegendStudioApplicationPlugin.d.ts +39 -0
  12. package/lib/components/DSL_DataSpace_LegendStudioApplicationPlugin.d.ts.map +1 -0
  13. package/lib/components/DSL_DataSpace_LegendStudioApplicationPlugin.js +206 -0
  14. package/lib/components/DSL_DataSpace_LegendStudioApplicationPlugin.js.map +1 -0
  15. package/lib/components/DataSpacePreviewAction.d.ts +25 -0
  16. package/lib/components/DataSpacePreviewAction.d.ts.map +1 -0
  17. package/lib/components/DataSpacePreviewAction.js +53 -0
  18. package/lib/components/DataSpacePreviewAction.js.map +1 -0
  19. package/lib/components/DataSpaceQueryAction.d.ts +24 -0
  20. package/lib/components/DataSpaceQueryAction.d.ts.map +1 -0
  21. package/lib/components/DataSpaceQueryAction.js +52 -0
  22. package/lib/components/DataSpaceQueryAction.js.map +1 -0
  23. package/lib/components/DataSpaceTemplateQueryPromoteReview.d.ts +19 -0
  24. package/lib/components/DataSpaceTemplateQueryPromoteReview.d.ts.map +1 -0
  25. package/lib/components/DataSpaceTemplateQueryPromoteReview.js +81 -0
  26. package/lib/components/DataSpaceTemplateQueryPromoteReview.js.map +1 -0
  27. package/lib/index.css +17 -0
  28. package/lib/index.css.map +1 -0
  29. package/lib/index.d.ts +17 -0
  30. package/lib/index.d.ts.map +1 -0
  31. package/lib/index.js +17 -0
  32. package/lib/index.js.map +1 -0
  33. package/lib/package.json +75 -0
  34. package/lib/stores/DataSpacePreviewState.d.ts +33 -0
  35. package/lib/stores/DataSpacePreviewState.d.ts.map +1 -0
  36. package/lib/stores/DataSpacePreviewState.js +116 -0
  37. package/lib/stores/DataSpacePreviewState.js.map +1 -0
  38. package/lib/stores/DataSpaceTemplateQueryPromotionReviewerStore.d.ts +61 -0
  39. package/lib/stores/DataSpaceTemplateQueryPromotionReviewerStore.d.ts.map +1 -0
  40. package/lib/stores/DataSpaceTemplateQueryPromotionReviewerStore.js +406 -0
  41. package/lib/stores/DataSpaceTemplateQueryPromotionReviewerStore.js.map +1 -0
  42. package/package.json +75 -0
  43. package/src/__lib__/DSL_DataSpace_LegendStudioCodeSnippet.ts +54 -0
  44. package/src/__lib__/DSL_DataSpace_LegendStudioDocumentation.ts +21 -0
  45. package/src/components/DSL_DataSpace_LegendStudioApplicationPlugin.tsx +299 -0
  46. package/src/components/DataSpacePreviewAction.tsx +136 -0
  47. package/src/components/DataSpaceQueryAction.tsx +100 -0
  48. package/src/components/DataSpaceTemplateQueryPromoteReview.tsx +292 -0
  49. package/src/index.ts +17 -0
  50. package/src/stores/DataSpacePreviewState.ts +199 -0
  51. package/src/stores/DataSpaceTemplateQueryPromotionReviewerStore.ts +636 -0
  52. package/tsconfig.json +54 -0
  53. package/tsconfig.package.json +37 -0
@@ -0,0 +1,292 @@
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 { BlankPanelContent, GitBranchIcon, clsx } from '@finos/legend-art';
18
+ import { observer, useLocalObservable } from 'mobx-react-lite';
19
+ import { useApplicationStore } from '@finos/legend-application';
20
+ import { useParams } from '@finos/legend-application/browser';
21
+ import {
22
+ ActivityBarMenu,
23
+ LEGEND_STUDIO_TEST_ID,
24
+ useLegendStudioApplicationStore,
25
+ useLegendStudioBaseStore,
26
+ } from '@finos/legend-application-studio';
27
+ import { createContext, useContext } from 'react';
28
+ import { guaranteeNonNullable } from '@finos/legend-shared';
29
+ import { flowResult } from 'mobx';
30
+ import { DocumentationLink } from '@finos/legend-lego/application';
31
+ import {
32
+ DATA_SPACE_TEMPLATE_QUERY_PROMOTION_ROUTE_PATTERN_TOKEN,
33
+ type DataSpaceTemplateQueryPromotionReviewerPathParams,
34
+ } from '@finos/legend-extension-dsl-data-space/application';
35
+ import { DSL_DATA_SPACE_LEGEND_STUDIO_DOCUMENTATION_KEY } from '../__lib__/DSL_DataSpace_LegendStudioDocumentation.js';
36
+ import { DataSpaceTemplateQueryPromotionReviewerStore } from '../stores/DataSpaceTemplateQueryPromotionReviewerStore.js';
37
+
38
+ const TemplateQueryPromotionReviewerStoreContext = createContext<
39
+ DataSpaceTemplateQueryPromotionReviewerStore | undefined
40
+ >(undefined);
41
+
42
+ const DataSpaceTemplateQueryPromotionReviewerStoreProvider: React.FC<{
43
+ children: React.ReactNode;
44
+ dataSpacePath: string;
45
+ queryId: string;
46
+ }> = ({ children, dataSpacePath, queryId }) => {
47
+ const applicationStore = useLegendStudioApplicationStore();
48
+ const baseStore = useLegendStudioBaseStore();
49
+ const store = useLocalObservable(
50
+ () =>
51
+ new DataSpaceTemplateQueryPromotionReviewerStore(
52
+ applicationStore,
53
+ baseStore.sdlcServerClient,
54
+ baseStore.depotServerClient,
55
+ ),
56
+ );
57
+ store.initialize(queryId, dataSpacePath);
58
+ return (
59
+ <TemplateQueryPromotionReviewerStoreContext.Provider value={store}>
60
+ {children}
61
+ </TemplateQueryPromotionReviewerStoreContext.Provider>
62
+ );
63
+ };
64
+
65
+ const useTemplateQueryPromotionReviewerStore =
66
+ (): DataSpaceTemplateQueryPromotionReviewerStore =>
67
+ guaranteeNonNullable(
68
+ useContext(TemplateQueryPromotionReviewerStoreContext),
69
+ `Can't find query productionizer store in context`,
70
+ );
71
+
72
+ const TemplateQueryPromotionReviewerContent = observer(() => {
73
+ const applicationStore = useApplicationStore();
74
+ const queryPromotionReviewerStore = useTemplateQueryPromotionReviewerStore();
75
+ const isLoadingEditor = !queryPromotionReviewerStore.initState.hasCompleted;
76
+
77
+ // workspace name
78
+ const changeWorkspaceName: React.ChangeEventHandler<HTMLInputElement> = (
79
+ event,
80
+ ) => queryPromotionReviewerStore.setWorkspaceName(event.target.value);
81
+
82
+ // template query
83
+ const onChangeTemplateQueryId: React.ChangeEventHandler<HTMLInputElement> = (
84
+ event,
85
+ ) => queryPromotionReviewerStore.setTemplateQueryId(event.target.value);
86
+
87
+ const onChangeTemplateQueryTitle: React.ChangeEventHandler<
88
+ HTMLInputElement
89
+ > = (event) =>
90
+ queryPromotionReviewerStore.setTemplateQueryTitle(event.target.value);
91
+
92
+ const onChangeTemplateQueryDescription: React.ChangeEventHandler<
93
+ HTMLInputElement
94
+ > = (event) =>
95
+ queryPromotionReviewerStore.setTemplateQueryDescription(event.target.value);
96
+
97
+ // actions
98
+ const promoteTemplateQuery = (): void => {
99
+ flowResult(queryPromotionReviewerStore.promoteAsTemplateQuery()).catch(
100
+ applicationStore.alertUnhandledError,
101
+ );
102
+ };
103
+
104
+ return (
105
+ <div className="app__page">
106
+ {isLoadingEditor && (
107
+ <BlankPanelContent>
108
+ {queryPromotionReviewerStore.initState.message ??
109
+ queryPromotionReviewerStore.graphManagerState.systemBuildState
110
+ .message ??
111
+ queryPromotionReviewerStore.graphManagerState.dependenciesBuildState
112
+ .message ??
113
+ queryPromotionReviewerStore.graphManagerState.generationsBuildState
114
+ .message ??
115
+ queryPromotionReviewerStore.graphManagerState.graphBuildState
116
+ .message}
117
+ </BlankPanelContent>
118
+ )}
119
+ <div className="template-query-promotor">
120
+ <div className="template-query-promotor__body">
121
+ <div className="activity-bar">
122
+ <ActivityBarMenu />
123
+ </div>
124
+ <div
125
+ className="template-query-promotor__content"
126
+ data-testid={LEGEND_STUDIO_TEST_ID.SETUP__CONTENT}
127
+ >
128
+ <div className="template-query-promotor__content__main">
129
+ <div className="template-query-promotor__title">
130
+ Promote as Curated Template Query
131
+ <DocumentationLink
132
+ documentationKey={
133
+ DSL_DATA_SPACE_LEGEND_STUDIO_DOCUMENTATION_KEY.CURATED_TEMPLATE_QUERY
134
+ }
135
+ />
136
+ </div>
137
+ <div className="template-query-promotor__title__prompt">
138
+ We will promote this query as a curated template query in
139
+ dataspace. This automated process will generate a code review
140
+ and workspace. Please get the generated code review reviewed and
141
+ approved.
142
+ </div>
143
+ <div className="template-query-promotor__group template-query-promotor__group--workspace">
144
+ <div className="template-query-promotor__group__header">
145
+ workspace
146
+ </div>
147
+ <div className="template-query-promotor__group__content">
148
+ <div className="template-query-promotor__input">
149
+ <div
150
+ className="template-query-promotor__input__icon"
151
+ title="workspace"
152
+ >
153
+ <GitBranchIcon className="template-query-promotor__input__icon--workspce" />
154
+ </div>
155
+ <div className="input-group template-query-promotor__input__input">
156
+ <input
157
+ className={clsx(
158
+ 'input input--dark input-group__input',
159
+ {
160
+ 'input-group__input--error':
161
+ !queryPromotionReviewerStore.isWorkspaceNameValid,
162
+ },
163
+ )}
164
+ spellCheck={false}
165
+ value={queryPromotionReviewerStore.workspaceName}
166
+ placeholder="Enter a name for your workspace"
167
+ onChange={changeWorkspaceName}
168
+ />
169
+ {!queryPromotionReviewerStore.isWorkspaceNameValid && (
170
+ <div className="input-group__error-message">
171
+ Workspace already existed
172
+ </div>
173
+ )}
174
+ </div>
175
+ </div>
176
+ </div>
177
+ </div>
178
+ <div className="template-query-promotor__group template-query-promotor__group--template">
179
+ <div className="template-query-promotor__group__header">
180
+ template query
181
+ </div>
182
+ <div className="template-query-promotor__group__content">
183
+ <div className="template-query-promotor__input">
184
+ <div className="template-query-promotor__input__label">
185
+ id
186
+ </div>
187
+ <div className="input-group template-query-promotor__input__input">
188
+ <input
189
+ className={clsx(
190
+ 'input input--dark input-group__input',
191
+ {
192
+ 'input-group__input--error':
193
+ !queryPromotionReviewerStore.isTemplateQueryIdValid,
194
+ },
195
+ )}
196
+ spellCheck={false}
197
+ placeholder="Create an id for your template query"
198
+ value={queryPromotionReviewerStore.templateQueryId}
199
+ onChange={onChangeTemplateQueryId}
200
+ />
201
+ {!queryPromotionReviewerStore.isTemplateQueryIdValid && (
202
+ <div className="input-group__error-message">
203
+ Invalid template query id
204
+ </div>
205
+ )}
206
+ </div>
207
+ </div>
208
+ <div className="template-query-promotor__input">
209
+ <div className="template-query-promotor__input__label">
210
+ title
211
+ </div>
212
+ <div className="input-group template-query-promotor__input__input">
213
+ <input
214
+ className="input input--dark input-group__input"
215
+ spellCheck={false}
216
+ placeholder="Create a title for your template query"
217
+ value={queryPromotionReviewerStore.templateQueryTitle}
218
+ onChange={onChangeTemplateQueryTitle}
219
+ />
220
+ </div>
221
+ </div>
222
+ <div className="template-query-promotor__input">
223
+ <div className="template-query-promotor__input__label">
224
+ description
225
+ </div>
226
+ <div className="input-group template-query-promotor__input__input">
227
+ <input
228
+ className="input input--dark input-group__input"
229
+ spellCheck={false}
230
+ placeholder="Add some descriptions for your template query"
231
+ value={
232
+ queryPromotionReviewerStore.templateQueryDescription
233
+ }
234
+ onChange={onChangeTemplateQueryDescription}
235
+ />
236
+ </div>
237
+ </div>
238
+ </div>
239
+ </div>
240
+ <div className="template-query-promotor__actions">
241
+ <button
242
+ className="template-query-promotor__next-btn btn--dark"
243
+ onClick={promoteTemplateQuery}
244
+ disabled={
245
+ queryPromotionReviewerStore.promoteState.isInProgress ||
246
+ !queryPromotionReviewerStore.currentQuery ||
247
+ !queryPromotionReviewerStore.currentQueryInfo ||
248
+ !queryPromotionReviewerStore.currentProject ||
249
+ !queryPromotionReviewerStore
250
+ .currentProjectConfigurationStatus?.isConfigured ||
251
+ !queryPromotionReviewerStore.workspaceName ||
252
+ !queryPromotionReviewerStore.templateQueryTitle ||
253
+ !queryPromotionReviewerStore.isWorkspaceNameValid ||
254
+ !queryPromotionReviewerStore.isTemplateQueryIdValid
255
+ }
256
+ >
257
+ Promote Query
258
+ </button>
259
+ </div>
260
+ </div>
261
+ </div>
262
+ </div>
263
+ <div
264
+ data-testid={LEGEND_STUDIO_TEST_ID.STATUS_BAR}
265
+ className="editor__status-bar"
266
+ />
267
+ </div>
268
+ </div>
269
+ );
270
+ });
271
+
272
+ export const DataSpaceTemplateQueryPromotionReviewer = observer(() => {
273
+ const parameters =
274
+ useParams<DataSpaceTemplateQueryPromotionReviewerPathParams>();
275
+ const dataSpacePath =
276
+ parameters[
277
+ DATA_SPACE_TEMPLATE_QUERY_PROMOTION_ROUTE_PATTERN_TOKEN.DATA_SPACE_PATH
278
+ ];
279
+ const queryId =
280
+ parameters[
281
+ DATA_SPACE_TEMPLATE_QUERY_PROMOTION_ROUTE_PATTERN_TOKEN.QUERY_ID
282
+ ];
283
+
284
+ return (
285
+ <DataSpaceTemplateQueryPromotionReviewerStoreProvider
286
+ dataSpacePath={dataSpacePath}
287
+ queryId={queryId}
288
+ >
289
+ <TemplateQueryPromotionReviewerContent />
290
+ </DataSpaceTemplateQueryPromotionReviewerStoreProvider>
291
+ );
292
+ });
package/src/index.ts ADDED
@@ -0,0 +1,17 @@
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
+ export { DSL_DataSpace_LegendStudioApplicationPlugin } from './components/DSL_DataSpace_LegendStudioApplicationPlugin.js';
@@ -0,0 +1,199 @@
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 {
18
+ EditorExtensionState,
19
+ queryClass,
20
+ type EditorStore,
21
+ } from '@finos/legend-application-studio';
22
+ import {
23
+ DataSpaceViewerState,
24
+ EXTERNAL_APPLICATION_NAVIGATION__generateServiceQueryCreatorUrl,
25
+ } from '@finos/legend-extension-dsl-data-space/application';
26
+ import {
27
+ DSL_DataSpace_getGraphManagerExtension,
28
+ type DataSpaceAnalysisResult,
29
+ type DataSpace,
30
+ } from '@finos/legend-extension-dsl-data-space/graph';
31
+ import { InMemoryGraphData, type Class } from '@finos/legend-graph';
32
+ import {
33
+ type GeneratorFn,
34
+ guaranteeNonNullable,
35
+ ActionState,
36
+ assertErrorThrown,
37
+ } from '@finos/legend-shared';
38
+ import { action, flow, makeObservable, observable } from 'mobx';
39
+
40
+ export class DataSpacePreviewState extends EditorExtensionState {
41
+ private static readonly IDENTIFIER = 'data-space-preview';
42
+
43
+ readonly editorStore: EditorStore;
44
+ readonly loadDataSpaceState = ActionState.create();
45
+
46
+ dataSpace?: DataSpace | undefined;
47
+ dataSpaceViewerState?: DataSpaceViewerState | undefined;
48
+
49
+ constructor(editorStore: EditorStore) {
50
+ super();
51
+
52
+ makeObservable(this, {
53
+ dataSpace: observable,
54
+ dataSpaceViewerState: observable,
55
+ setDataSpace: action,
56
+ previewDataSpace: flow,
57
+ });
58
+
59
+ this.editorStore = editorStore;
60
+ }
61
+
62
+ override get INTERNAL__identifierKey(): string {
63
+ return DataSpacePreviewState.IDENTIFIER;
64
+ }
65
+
66
+ static retrieveNullableState(
67
+ editorStore: EditorStore,
68
+ ): DataSpacePreviewState | undefined {
69
+ return editorStore.extensionStates.find((extensionState) => {
70
+ if (
71
+ /**
72
+ * In development mode, when we make changes in certain areas like utils or base states, the following `instanceof`
73
+ * check will fail as if there were multiple copies of the classes with the same name, this could be caused by either
74
+ * React `fast-refresh` or `webpack HMR`; we didn't have time to really do a thorough debug here, as such,
75
+ * we will just do a simple key check to match the right state to bypass the problem for development mode.
76
+ */
77
+ // eslint-disable-next-line no-process-env
78
+ process.env.NODE_ENV === 'development'
79
+ ) {
80
+ return (
81
+ extensionState.INTERNAL__identifierKey ===
82
+ DataSpacePreviewState.IDENTIFIER
83
+ );
84
+ }
85
+ return extensionState instanceof DataSpacePreviewState;
86
+ }) as DataSpacePreviewState;
87
+ }
88
+
89
+ static retrieveState(editorStore: EditorStore): DataSpacePreviewState {
90
+ return guaranteeNonNullable(
91
+ DataSpacePreviewState.retrieveNullableState(editorStore),
92
+ `Can't find data space preview state: make sure it is added as an editor extension state`,
93
+ );
94
+ }
95
+
96
+ setDataSpace(val: DataSpace | undefined): void {
97
+ this.dataSpace = val;
98
+ if (val === undefined) {
99
+ this.dataSpaceViewerState = undefined;
100
+ }
101
+ }
102
+
103
+ *previewDataSpace(dataSpace: DataSpace): GeneratorFn<void> {
104
+ this.setDataSpace(dataSpace);
105
+ this.loadDataSpaceState.inProgress();
106
+ this.loadDataSpaceState.setMessage(`Initializing...`);
107
+
108
+ try {
109
+ const groupId =
110
+ this.editorStore.projectConfigurationEditorState
111
+ .currentProjectConfiguration.groupId;
112
+ const artifactId =
113
+ this.editorStore.projectConfigurationEditorState
114
+ .currentProjectConfiguration.artifactId;
115
+ const versionId = 'LOCAL';
116
+
117
+ // analyze data space
118
+ const analysisResult = (yield DSL_DataSpace_getGraphManagerExtension(
119
+ this.editorStore.graphManagerState.graphManager,
120
+ ).analyzeDataSpace(
121
+ dataSpace.path,
122
+ async () =>
123
+ this.editorStore.graphManagerState.graph.allOwnElements
124
+ .map((element) =>
125
+ this.editorStore.graphManagerState.graphManager.elementToEntity(
126
+ element,
127
+ ),
128
+ )
129
+ .concat(
130
+ this.editorStore.graphManagerState.graph.dependencyManager.allOwnElements.map(
131
+ (element) =>
132
+ this.editorStore.graphManagerState.graphManager.elementToEntity(
133
+ element,
134
+ ),
135
+ ),
136
+ ),
137
+ undefined,
138
+ this.loadDataSpaceState,
139
+ )) as DataSpaceAnalysisResult;
140
+
141
+ this.dataSpaceViewerState = new DataSpaceViewerState(
142
+ this.editorStore.applicationStore,
143
+ this.editorStore.graphManagerState,
144
+ groupId,
145
+ artifactId,
146
+ versionId,
147
+ analysisResult,
148
+ {
149
+ retrieveGraphData: () =>
150
+ new InMemoryGraphData(this.editorStore.graphManagerState.graph),
151
+ queryDataSpace: () => {
152
+ this.editorStore.applicationStore.notificationService.notifyWarning(
153
+ 'This feature is not supported in preview mode',
154
+ );
155
+ },
156
+ viewProject: () => {
157
+ this.editorStore.applicationStore.notificationService.notifyWarning(
158
+ 'This feature is not supported in preview mode',
159
+ );
160
+ },
161
+ viewSDLCProject: async () => {
162
+ this.editorStore.applicationStore.notificationService.notifyWarning(
163
+ 'This feature is not supported in preview mode',
164
+ );
165
+ },
166
+ queryClass: (_class: Class): void => {
167
+ queryClass(_class, this.editorStore).catch(
168
+ this.editorStore.applicationStore.alertUnhandledError,
169
+ );
170
+ },
171
+ openServiceQuery: (servicePath: string): void => {
172
+ if (this.editorStore.applicationStore.config.queryApplicationUrl) {
173
+ this.editorStore.applicationStore.navigationService.navigator.visitAddress(
174
+ EXTERNAL_APPLICATION_NAVIGATION__generateServiceQueryCreatorUrl(
175
+ this.editorStore.applicationStore.config.queryApplicationUrl,
176
+ groupId,
177
+ artifactId,
178
+ versionId,
179
+ servicePath,
180
+ ),
181
+ );
182
+ } else {
183
+ this.editorStore.applicationStore.notificationService.notifyWarning(
184
+ 'Query application URL is not configured',
185
+ );
186
+ }
187
+ },
188
+ },
189
+ );
190
+ this.loadDataSpaceState.pass();
191
+ } catch (error) {
192
+ assertErrorThrown(error);
193
+ this.loadDataSpaceState.fail();
194
+ this.editorStore.applicationStore.notificationService.notifyError(error);
195
+ } finally {
196
+ this.loadDataSpaceState.setMessage(undefined);
197
+ }
198
+ }
199
+ }