@finos/legend-extension-dsl-data-space 10.1.96 → 10.2.1

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 (109) hide show
  1. package/lib/__lib__/query/DSL_DataSpace_LegendQueryNavigation.d.ts +18 -6
  2. package/lib/__lib__/query/DSL_DataSpace_LegendQueryNavigation.d.ts.map +1 -1
  3. package/lib/__lib__/query/DSL_DataSpace_LegendQueryNavigation.js +18 -6
  4. package/lib/__lib__/query/DSL_DataSpace_LegendQueryNavigation.js.map +1 -1
  5. package/lib/components/DSL_DataSpace_LegendApplicationPlugin.d.ts.map +1 -1
  6. package/lib/components/DSL_DataSpace_LegendApplicationPlugin.js +1 -0
  7. package/lib/components/DSL_DataSpace_LegendApplicationPlugin.js.map +1 -1
  8. package/lib/components/query/DSL_DataSpace_LegendQueryApplicationPlugin.d.ts +4 -1
  9. package/lib/components/query/DSL_DataSpace_LegendQueryApplicationPlugin.d.ts.map +1 -1
  10. package/lib/components/query/DSL_DataSpace_LegendQueryApplicationPlugin.js +55 -5
  11. package/lib/components/query/DSL_DataSpace_LegendQueryApplicationPlugin.js.map +1 -1
  12. package/lib/components/query/DataSpaceAdvancedSearchModal.d.ts.map +1 -1
  13. package/lib/components/query/DataSpaceAdvancedSearchModal.js +5 -17
  14. package/lib/components/query/DataSpaceAdvancedSearchModal.js.map +1 -1
  15. package/lib/components/query/DataSpaceQueryBuilder.d.ts.map +1 -1
  16. package/lib/components/query/DataSpaceQueryBuilder.js +4 -16
  17. package/lib/components/query/DataSpaceQueryBuilder.js.map +1 -1
  18. package/lib/components/query/DataSpaceQueryBuilderTemplateQueryPanelContent.js +1 -1
  19. package/lib/components/query/DataSpaceQueryBuilderTemplateQueryPanelContent.js.map +1 -1
  20. package/lib/components/query/DataSpaceQuerySetup.d.ts.map +1 -1
  21. package/lib/components/query/DataSpaceQuerySetup.js +3 -16
  22. package/lib/components/query/DataSpaceQuerySetup.js.map +1 -1
  23. package/lib/components/query/DataSpaceTemplateQueryCreator.js +4 -4
  24. package/lib/components/query/DataSpaceTemplateQueryCreator.js.map +1 -1
  25. package/lib/components/studio/DSL_DataSpace_LegendStudioApplicationPlugin.d.ts +2 -0
  26. package/lib/components/studio/DSL_DataSpace_LegendStudioApplicationPlugin.d.ts.map +1 -1
  27. package/lib/components/studio/DSL_DataSpace_LegendStudioApplicationPlugin.js +13 -0
  28. package/lib/components/studio/DSL_DataSpace_LegendStudioApplicationPlugin.js.map +1 -1
  29. package/lib/components/studio/DataSpaceTemplateQueryPromoteReview.d.ts +19 -0
  30. package/lib/components/studio/DataSpaceTemplateQueryPromoteReview.d.ts.map +1 -0
  31. package/lib/components/studio/DataSpaceTemplateQueryPromoteReview.js +79 -0
  32. package/lib/components/studio/DataSpaceTemplateQueryPromoteReview.js.map +1 -0
  33. package/lib/graph/metamodel/pure/model/packageableElements/dataSpace/DSL_DataSpace_DataSpace.d.ts +1 -0
  34. package/lib/graph/metamodel/pure/model/packageableElements/dataSpace/DSL_DataSpace_DataSpace.d.ts.map +1 -1
  35. package/lib/graph/metamodel/pure/model/packageableElements/dataSpace/DSL_DataSpace_DataSpace.js +2 -0
  36. package/lib/graph/metamodel/pure/model/packageableElements/dataSpace/DSL_DataSpace_DataSpace.js.map +1 -1
  37. package/lib/graph-manager/action/analytics/DataSpaceAnalysis.d.ts +1 -0
  38. package/lib/graph-manager/action/analytics/DataSpaceAnalysis.d.ts.map +1 -1
  39. package/lib/graph-manager/action/analytics/DataSpaceAnalysis.js +1 -0
  40. package/lib/graph-manager/action/analytics/DataSpaceAnalysis.js.map +1 -1
  41. package/lib/graph-manager/protocol/pure/DSL_DataSpace_PureGraphManagerExtension.d.ts +10 -1
  42. package/lib/graph-manager/protocol/pure/DSL_DataSpace_PureGraphManagerExtension.d.ts.map +1 -1
  43. package/lib/graph-manager/protocol/pure/DSL_DataSpace_PureGraphManagerExtension.js.map +1 -1
  44. package/lib/graph-manager/protocol/pure/DSL_DataSpace_PureProtocolProcessorPlugin.d.ts.map +1 -1
  45. package/lib/graph-manager/protocol/pure/DSL_DataSpace_PureProtocolProcessorPlugin.js +2 -0
  46. package/lib/graph-manager/protocol/pure/DSL_DataSpace_PureProtocolProcessorPlugin.js.map +1 -1
  47. package/lib/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.d.ts +12 -1
  48. package/lib/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.d.ts.map +1 -1
  49. package/lib/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.js +28 -3
  50. package/lib/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.js.map +1 -1
  51. package/lib/graph-manager/protocol/pure/v1/engine/analytics/V1_DataSpaceAnalysis.d.ts +1 -0
  52. package/lib/graph-manager/protocol/pure/v1/engine/analytics/V1_DataSpaceAnalysis.d.ts.map +1 -1
  53. package/lib/graph-manager/protocol/pure/v1/engine/analytics/V1_DataSpaceAnalysis.js +2 -0
  54. package/lib/graph-manager/protocol/pure/v1/engine/analytics/V1_DataSpaceAnalysis.js.map +1 -1
  55. package/lib/graph-manager/protocol/pure/v1/model/packageableElements/dataSpace/V1_DSL_DataSpace_DataSpace.d.ts +1 -0
  56. package/lib/graph-manager/protocol/pure/v1/model/packageableElements/dataSpace/V1_DSL_DataSpace_DataSpace.d.ts.map +1 -1
  57. package/lib/graph-manager/protocol/pure/v1/model/packageableElements/dataSpace/V1_DSL_DataSpace_DataSpace.js +2 -0
  58. package/lib/graph-manager/protocol/pure/v1/model/packageableElements/dataSpace/V1_DSL_DataSpace_DataSpace.js.map +1 -1
  59. package/lib/graph-manager/protocol/pure/v1/transformation/pureProtocol/V1_DSL_DataSpace_ProtocolHelper.d.ts.map +1 -1
  60. package/lib/graph-manager/protocol/pure/v1/transformation/pureProtocol/V1_DSL_DataSpace_ProtocolHelper.js +1 -0
  61. package/lib/graph-manager/protocol/pure/v1/transformation/pureProtocol/V1_DSL_DataSpace_ProtocolHelper.js.map +1 -1
  62. package/lib/index.css +2 -2
  63. package/lib/index.css.map +1 -1
  64. package/lib/package.json +2 -1
  65. package/lib/stores/query/DataSpaceAdvancedSearchState.d.ts +1 -1
  66. package/lib/stores/query/DataSpaceAdvancedSearchState.d.ts.map +1 -1
  67. package/lib/stores/query/DataSpaceAdvancedSearchState.js +3 -6
  68. package/lib/stores/query/DataSpaceAdvancedSearchState.js.map +1 -1
  69. package/lib/stores/query/DataSpaceQueryBuilderState.d.ts +1 -1
  70. package/lib/stores/query/DataSpaceQueryBuilderState.d.ts.map +1 -1
  71. package/lib/stores/query/DataSpaceQueryBuilderState.js +3 -6
  72. package/lib/stores/query/DataSpaceQueryBuilderState.js.map +1 -1
  73. package/lib/stores/query/DataSpaceQuerySetupStore.d.ts +1 -1
  74. package/lib/stores/query/DataSpaceQuerySetupStore.d.ts.map +1 -1
  75. package/lib/stores/query/DataSpaceQuerySetupStore.js +3 -6
  76. package/lib/stores/query/DataSpaceQuerySetupStore.js.map +1 -1
  77. package/lib/stores/query/DataSpaceTemplateQueryCreatorStore.d.ts +3 -2
  78. package/lib/stores/query/DataSpaceTemplateQueryCreatorStore.d.ts.map +1 -1
  79. package/lib/stores/query/DataSpaceTemplateQueryCreatorStore.js +9 -13
  80. package/lib/stores/query/DataSpaceTemplateQueryCreatorStore.js.map +1 -1
  81. package/lib/stores/query/DataSpaceTemplateQueryPromotionReviewerStore.d.ts +61 -0
  82. package/lib/stores/query/DataSpaceTemplateQueryPromotionReviewerStore.d.ts.map +1 -0
  83. package/lib/stores/query/DataSpaceTemplateQueryPromotionReviewerStore.js +407 -0
  84. package/lib/stores/query/DataSpaceTemplateQueryPromotionReviewerStore.js.map +1 -0
  85. package/package.json +11 -10
  86. package/src/__lib__/query/DSL_DataSpace_LegendQueryNavigation.ts +43 -9
  87. package/src/components/DSL_DataSpace_LegendApplicationPlugin.tsx +1 -0
  88. package/src/components/query/DSL_DataSpace_LegendQueryApplicationPlugin.tsx +117 -3
  89. package/src/components/query/DataSpaceAdvancedSearchModal.tsx +4 -25
  90. package/src/components/query/DataSpaceQueryBuilder.tsx +3 -23
  91. package/src/components/query/DataSpaceQueryBuilderTemplateQueryPanelContent.tsx +1 -1
  92. package/src/components/query/DataSpaceQuerySetup.tsx +2 -24
  93. package/src/components/query/DataSpaceTemplateQueryCreator.tsx +6 -6
  94. package/src/components/studio/DSL_DataSpace_LegendStudioApplicationPlugin.tsx +18 -1
  95. package/src/components/studio/DataSpaceTemplateQueryPromoteReview.tsx +285 -0
  96. package/src/graph/metamodel/pure/model/packageableElements/dataSpace/DSL_DataSpace_DataSpace.ts +2 -0
  97. package/src/graph-manager/action/analytics/DataSpaceAnalysis.ts +1 -0
  98. package/src/graph-manager/protocol/pure/DSL_DataSpace_PureGraphManagerExtension.ts +15 -0
  99. package/src/graph-manager/protocol/pure/DSL_DataSpace_PureProtocolProcessorPlugin.ts +2 -0
  100. package/src/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.ts +66 -2
  101. package/src/graph-manager/protocol/pure/v1/engine/analytics/V1_DataSpaceAnalysis.ts +2 -0
  102. package/src/graph-manager/protocol/pure/v1/model/packageableElements/dataSpace/V1_DSL_DataSpace_DataSpace.ts +2 -0
  103. package/src/graph-manager/protocol/pure/v1/transformation/pureProtocol/V1_DSL_DataSpace_ProtocolHelper.ts +1 -0
  104. package/src/stores/query/DataSpaceAdvancedSearchState.ts +3 -11
  105. package/src/stores/query/DataSpaceQueryBuilderState.ts +3 -11
  106. package/src/stores/query/DataSpaceQuerySetupStore.ts +3 -11
  107. package/src/stores/query/DataSpaceTemplateQueryCreatorStore.ts +12 -24
  108. package/src/stores/query/DataSpaceTemplateQueryPromotionReviewerStore.ts +636 -0
  109. package/tsconfig.json +2 -0
@@ -16,15 +16,17 @@
16
16
 
17
17
  import packageJson from '../../../package.json' assert { type: 'json' };
18
18
  import {
19
- type QuerySetupActionConfiguration,
20
19
  type ExistingQueryEditorStateBuilder,
21
- type ExistingQueryEditorStore,
20
+ type QueryEditorStore,
21
+ type QuerySetupActionConfiguration,
22
+ ExistingQueryEditorStore,
22
23
  LegendQueryApplicationPlugin,
23
24
  LEGEND_QUERY_APP_EVENT,
24
25
  createViewProjectHandler,
25
26
  createViewSDLCProjectHandler,
27
+ type QueryEditorActionConfiguration,
26
28
  } from '@finos/legend-application-query';
27
- import { SquareIcon } from '@finos/legend-art';
29
+ import { ArrowCircleUpIcon, SquareIcon } from '@finos/legend-art';
28
30
  import {
29
31
  ActionAlertActionType,
30
32
  ActionAlertType,
@@ -34,6 +36,7 @@ import {
34
36
  DATA_SPACE_QUERY_ROUTE_PATTERN,
35
37
  generateDataSpaceQueryCreatorRoute,
36
38
  generateDataSpaceQuerySetupRoute,
39
+ generateDataSpaceTemplateQueryPromotionRoute,
37
40
  } from '../../__lib__/query/DSL_DataSpace_LegendQueryNavigation.js';
38
41
  import { DataSpaceQueryCreator } from './DataSpaceQueryCreator.js';
39
42
  import {
@@ -54,6 +57,7 @@ import type { DataSpaceInfo } from '../../stores/query/DataSpaceInfo.js';
54
57
  import { getOwnDataSpace } from '../../graph-manager/DSL_DataSpace_GraphManagerHelper.js';
55
58
  import {
56
59
  assertErrorThrown,
60
+ buildUrl,
57
61
  guaranteeNonNullable,
58
62
  LogEvent,
59
63
  } from '@finos/legend-shared';
@@ -71,6 +75,8 @@ import type {
71
75
  DataSpaceExecutionContext,
72
76
  } from '../../graph/metamodel/pure/model/packageableElements/dataSpace/DSL_DataSpace_DataSpace.js';
73
77
  import { DataSpaceTemplateQueryCreator } from './DataSpaceTemplateQueryCreator.js';
78
+ import { DataSpaceTemplateQueryCreatorStore } from '../../stores/query/DataSpaceTemplateQueryCreatorStore.js';
79
+ import { parseProjectIdentifier } from '@finos/legend-storage';
74
80
 
75
81
  const resolveExecutionContext = (
76
82
  dataSpace: DataSpace,
@@ -305,4 +311,112 @@ export class DSL_DataSpace_LegendQueryApplicationPlugin extends LegendQueryAppli
305
311
  },
306
312
  ];
307
313
  }
314
+
315
+ override getExtraQueryHeaders(): ((
316
+ editorStore: QueryEditorStore,
317
+ ) => React.ReactNode | undefined)[] {
318
+ return [
319
+ (editorStore: QueryEditorStore): React.ReactNode | undefined => {
320
+ if (editorStore instanceof DataSpaceTemplateQueryCreatorStore) {
321
+ return (
322
+ <div className="query-editor__dataspace__header">
323
+ <div className="query-editor__header__content__main query-editor__header__content__title__text query-editor__dataspace__header__title__text">
324
+ {editorStore.templateQueryTitle}
325
+ </div>
326
+ <div className="query-editor__dataspace__header__title__tag">
327
+ template
328
+ </div>
329
+ </div>
330
+ );
331
+ }
332
+ return undefined;
333
+ },
334
+ ];
335
+ }
336
+
337
+ override getExtraQueryEditorActionConfigurations(): QueryEditorActionConfiguration[] {
338
+ return [
339
+ {
340
+ key: 'promote-as-curated-template-query',
341
+ renderer: (editorStore, queryBuilderState) => {
342
+ const proceedCuratedTemplateQueryPromotion =
343
+ async (): Promise<void> => {
344
+ if (
345
+ !(
346
+ editorStore instanceof ExistingQueryEditorStore &&
347
+ queryBuilderState instanceof DataSpaceQueryBuilderState
348
+ )
349
+ ) {
350
+ return;
351
+ }
352
+ // fetch project data
353
+ const project = StoreProjectData.serialization.fromJson(
354
+ await editorStore.depotServerClient.getProject(
355
+ editorStore.lightQuery.groupId,
356
+ editorStore.lightQuery.artifactId,
357
+ ),
358
+ );
359
+
360
+ // find the matching SDLC instance
361
+ const projectIDPrefix = parseProjectIdentifier(
362
+ project.projectId,
363
+ ).prefix;
364
+ const matchingSDLCEntry =
365
+ editorStore.applicationStore.config.studioInstances.find(
366
+ (entry) => entry.sdlcProjectIDPrefix === projectIDPrefix,
367
+ );
368
+ if (matchingSDLCEntry) {
369
+ editorStore.applicationStore.navigationService.navigator.visitAddress(
370
+ buildUrl([
371
+ editorStore.applicationStore.config.studioApplicationUrl,
372
+ generateDataSpaceTemplateQueryPromotionRoute(
373
+ editorStore.lightQuery.groupId,
374
+ editorStore.lightQuery.artifactId,
375
+ editorStore.lightQuery.versionId,
376
+ queryBuilderState.dataSpace.path,
377
+ editorStore.lightQuery.id,
378
+ ),
379
+ ]),
380
+ );
381
+ } else {
382
+ editorStore.applicationStore.notificationService.notifyWarning(
383
+ `Can't find the corresponding SDLC instance to productionize the query`,
384
+ );
385
+ }
386
+ };
387
+
388
+ const proceed = (): void => {
389
+ queryBuilderState.changeDetectionState.alertUnsavedChanges(() => {
390
+ proceedCuratedTemplateQueryPromotion().catch(
391
+ editorStore.applicationStore.alertUnhandledError,
392
+ );
393
+ });
394
+ };
395
+
396
+ return (
397
+ <>
398
+ {editorStore instanceof ExistingQueryEditorStore &&
399
+ queryBuilderState instanceof DataSpaceQueryBuilderState && (
400
+ <button
401
+ className="query-editor__header__action btn--dark"
402
+ tabIndex={-1}
403
+ onClick={proceed}
404
+ title={
405
+ !(editorStore instanceof ExistingQueryEditorStore)
406
+ ? 'Please save your query first before promoting'
407
+ : 'Promote Curated Template query...'
408
+ }
409
+ >
410
+ <ArrowCircleUpIcon className="query-editor__header__action__icon--productionize" />
411
+ <div className="query-editor__header__action__label">
412
+ Promote as Template Query
413
+ </div>
414
+ </button>
415
+ )}
416
+ </>
417
+ );
418
+ },
419
+ },
420
+ ];
421
+ }
308
422
  }
@@ -33,10 +33,10 @@ import {
33
33
  ModalHeaderActions,
34
34
  } from '@finos/legend-art';
35
35
  import { generateGAVCoordinates } from '@finos/legend-storage';
36
- import { debounce, guaranteeNonNullable } from '@finos/legend-shared';
36
+ import { guaranteeNonNullable } from '@finos/legend-shared';
37
37
  import { flowResult } from 'mobx';
38
38
  import { observer } from 'mobx-react-lite';
39
- import { useEffect, useMemo, useRef, useState } from 'react';
39
+ import { useEffect, useRef } from 'react';
40
40
  import { DataSpaceViewer } from '../DataSpaceViewer.js';
41
41
  import type { DataSpaceInfo } from '../../stores/query/DataSpaceInfo.js';
42
42
  import type { DataSpaceAdvancedSearchState } from '../../stores/query/DataSpaceAdvancedSearchState.js';
@@ -55,17 +55,15 @@ export const DataSpaceAdvancedSearchModal = observer(
55
55
  const { searchState, onClose } = props;
56
56
  const applicationStore = useApplicationStore();
57
57
  const dataSpaceSearchRef = useRef<SelectComponent>(null);
58
- const [searchText, setSearchText] = useState('');
59
58
  const handleEnter = (): void => dataSpaceSearchRef.current?.focus();
60
59
  const proceedToCreateQuery = (): void => {
61
60
  flowResult(searchState.proceedToCreateQuery()).catch(
62
61
  applicationStore.alertUnhandledError,
63
62
  );
64
63
  };
65
-
66
64
  const toggleGetSnapshot = (): void => {
67
65
  searchState.setToGetSnapShot(!searchState.toGetSnapShot);
68
- flowResult(searchState.loadDataSpaces(searchText)).catch(
66
+ flowResult(searchState.loadDataSpaces()).catch(
69
67
  applicationStore.alertUnhandledError,
70
68
  );
71
69
  };
@@ -106,26 +104,9 @@ export const DataSpaceAdvancedSearchModal = observer(
106
104
  };
107
105
 
108
106
  // search text
109
- const debouncedLoadDataSpaces = useMemo(
110
- () =>
111
- debounce((input: string): void => {
112
- flowResult(searchState.loadDataSpaces(input)).catch(
113
- applicationStore.alertUnhandledError,
114
- );
115
- }, 500),
116
- [applicationStore, searchState],
117
- );
118
- const onSearchTextChange = (value: string): void => {
119
- if (value !== searchText) {
120
- setSearchText(value);
121
- debouncedLoadDataSpaces.cancel();
122
- debouncedLoadDataSpaces(value);
123
- }
124
- };
125
107
 
126
108
  useEffect(() => {
127
- searchState.loadDataSpaces('');
128
- flowResult(searchState.loadDataSpaces('')).catch(
109
+ flowResult(searchState.loadDataSpaces()).catch(
129
110
  applicationStore.alertUnhandledError,
130
111
  );
131
112
  }, [searchState, applicationStore]);
@@ -180,8 +161,6 @@ export const DataSpaceAdvancedSearchModal = observer(
180
161
  className="data-space-advanced-search__dialog__input__selector"
181
162
  options={dataSpaceOptions}
182
163
  isLoading={searchState.loadDataSpacesState.isInProgress}
183
- onInputChange={onSearchTextChange}
184
- inputValue={searchText}
185
164
  onChange={onDataSpaceOptionChange}
186
165
  value={selectedDataSpaceOption}
187
166
  placeholder="Search for data space by name..."
@@ -47,8 +47,8 @@ import {
47
47
  } from '@finos/legend-graph';
48
48
  import type { DataSpaceInfo } from '../../stores/query/DataSpaceInfo.js';
49
49
  import { generateGAVCoordinates } from '@finos/legend-storage';
50
- import { useEffect, useMemo, useState } from 'react';
51
- import { debounce, guaranteeType } from '@finos/legend-shared';
50
+ import { useEffect } from 'react';
51
+ import { guaranteeType } from '@finos/legend-shared';
52
52
  import { flowResult } from 'mobx';
53
53
  import {
54
54
  DataSpace,
@@ -129,7 +129,6 @@ const DataSpaceQueryBuilderSetupPanelContent = observer(
129
129
  (props: { queryBuilderState: DataSpaceQueryBuilderState }) => {
130
130
  const { queryBuilderState } = props;
131
131
  const applicationStore = useApplicationStore();
132
- const [dataSpaceSearchText, setDataSpaceSearchText] = useState('');
133
132
 
134
133
  // data space
135
134
  const dataSpaceOptions =
@@ -152,23 +151,6 @@ const DataSpaceQueryBuilderSetupPanelContent = observer(
152
151
  queryBuilderState.onDataSpaceChange(option.value);
153
152
  };
154
153
 
155
- // data space search text
156
- const debouncedLoadDataSpaces = useMemo(
157
- () =>
158
- debounce((input: string): void => {
159
- flowResult(queryBuilderState.loadDataSpaces(input)).catch(
160
- applicationStore.alertUnhandledError,
161
- );
162
- }, 500),
163
- [applicationStore, queryBuilderState],
164
- );
165
- const onDataSpaceSearchTextChange = (value: string): void => {
166
- if (value !== dataSpaceSearchText) {
167
- setDataSpaceSearchText(value);
168
- debouncedLoadDataSpaces.cancel();
169
- debouncedLoadDataSpaces(value);
170
- }
171
- };
172
154
  const openDataSpaceAdvancedSearch = (): void =>
173
155
  queryBuilderState.showAdvancedSearchPanel();
174
156
 
@@ -232,7 +214,7 @@ const DataSpaceQueryBuilderSetupPanelContent = observer(
232
214
  );
233
215
 
234
216
  useEffect(() => {
235
- flowResult(queryBuilderState.loadDataSpaces('')).catch(
217
+ flowResult(queryBuilderState.loadDataSpaces()).catch(
236
218
  applicationStore.alertUnhandledError,
237
219
  );
238
220
  }, [queryBuilderState, applicationStore]);
@@ -287,8 +269,6 @@ const DataSpaceQueryBuilderSetupPanelContent = observer(
287
269
  className="panel__content__form__section__dropdown query-builder__setup__config-group__item__selector"
288
270
  options={dataSpaceOptions}
289
271
  isLoading={queryBuilderState.loadDataSpacesState.isInProgress}
290
- onInputChange={onDataSpaceSearchTextChange}
291
- inputValue={dataSpaceSearchText}
292
272
  onChange={onDataSpaceOptionChange}
293
273
  value={selectedDataSpaceOption}
294
274
  placeholder="Search for data space..."
@@ -100,7 +100,7 @@ const DataSpaceTemplateQueryDialog = observer(
100
100
  queryBuilderState.projectInfo.artifactId,
101
101
  queryBuilderState.projectInfo.versionId,
102
102
  queryBuilderState.dataSpace.path,
103
- template.title,
103
+ template.id,
104
104
  ),
105
105
  ),
106
106
  );
@@ -15,7 +15,6 @@
15
15
  */
16
16
 
17
17
  import { observer, useLocalObservable } from 'mobx-react-lite';
18
- import { debounce } from '@finos/legend-shared';
19
18
  import { useApplicationStore } from '@finos/legend-application';
20
19
  import {
21
20
  QueryEditor,
@@ -23,7 +22,7 @@ import {
23
22
  useLegendQueryApplicationStore,
24
23
  useLegendQueryBaseStore,
25
24
  } from '@finos/legend-application-query';
26
- import { useEffect, useMemo, useRef, useState } from 'react';
25
+ import { useEffect, useRef } from 'react';
27
26
  import { flowResult } from 'mobx';
28
27
  import { QueryBuilderClassSelector } from '@finos/legend-query-builder';
29
28
  import {
@@ -82,8 +81,6 @@ const DataSpaceQuerySetupSetupPanelContent = observer(
82
81
  const { queryBuilderState } = props;
83
82
  const applicationStore = useApplicationStore();
84
83
  const dataSpaceSearchRef = useRef<SelectComponent>(null);
85
- const [dataSpaceSearchText, setDataSpaceSearchText] = useState('');
86
-
87
84
  // data space
88
85
  const dataSpaceOptions =
89
86
  queryBuilderState.dataSpaces.map(buildDataSpaceOption);
@@ -92,28 +89,11 @@ const DataSpaceQuerySetupSetupPanelContent = observer(
92
89
  queryBuilderState.onDataSpaceChange(option.value);
93
90
  };
94
91
 
95
- // data space search text
96
- const debouncedLoadDataSpaces = useMemo(
97
- () =>
98
- debounce((input: string): void => {
99
- flowResult(queryBuilderState.loadDataSpaces(input)).catch(
100
- applicationStore.alertUnhandledError,
101
- );
102
- }, 500),
103
- [applicationStore, queryBuilderState],
104
- );
105
- const onDataSpaceSearchTextChange = (value: string): void => {
106
- if (value !== dataSpaceSearchText) {
107
- setDataSpaceSearchText(value);
108
- debouncedLoadDataSpaces.cancel();
109
- debouncedLoadDataSpaces(value);
110
- }
111
- };
112
92
  const openDataSpaceAdvancedSearch = (): void =>
113
93
  queryBuilderState.showAdvancedSearchPanel();
114
94
 
115
95
  useEffect(() => {
116
- flowResult(queryBuilderState.loadDataSpaces('')).catch(
96
+ flowResult(queryBuilderState.loadDataSpaces()).catch(
117
97
  applicationStore.alertUnhandledError,
118
98
  );
119
99
  }, [queryBuilderState, applicationStore]);
@@ -141,8 +121,6 @@ const DataSpaceQuerySetupSetupPanelContent = observer(
141
121
  className="panel__content__form__section__dropdown query-builder__setup__config-group__item__selector"
142
122
  options={dataSpaceOptions}
143
123
  isLoading={queryBuilderState.loadDataSpacesState.isInProgress}
144
- onInputChange={onDataSpaceSearchTextChange}
145
- inputValue={dataSpaceSearchText}
146
124
  onChange={onDataSpaceOptionChange}
147
125
  value={selectedDataSpaceOption}
148
126
  placeholder="Search for data space..."
@@ -33,8 +33,8 @@ const DataSpaceTemplateQueryCreatorStoreProvider: React.FC<{
33
33
  children: React.ReactNode;
34
34
  gav: string;
35
35
  dataSpacePath: string;
36
- templateQueryTitle: string;
37
- }> = ({ children, gav, dataSpacePath, templateQueryTitle }) => {
36
+ templateQueryId: string;
37
+ }> = ({ children, gav, dataSpacePath, templateQueryId }) => {
38
38
  const { groupId, artifactId, versionId } = parseGAVCoordinates(gav);
39
39
  const applicationStore = useLegendQueryApplicationStore();
40
40
  const baseStore = useLegendQueryBaseStore();
@@ -47,7 +47,7 @@ const DataSpaceTemplateQueryCreatorStoreProvider: React.FC<{
47
47
  artifactId,
48
48
  versionId,
49
49
  dataSpacePath,
50
- templateQueryTitle,
50
+ templateQueryId,
51
51
  ),
52
52
  );
53
53
  return (
@@ -65,16 +65,16 @@ export const DataSpaceTemplateQueryCreator = observer(() => {
65
65
  parameters[
66
66
  DATA_SPACE_TEMPLATE_QUERY_CREATOR_ROUTE_PATTERN_TOKEN.DATA_SPACE_PATH
67
67
  ];
68
- const templateQueryTitle =
68
+ const templateQueryId =
69
69
  parameters[
70
- DATA_SPACE_TEMPLATE_QUERY_CREATOR_ROUTE_PATTERN_TOKEN.TEMPLATE_QUERY_TITLE
70
+ DATA_SPACE_TEMPLATE_QUERY_CREATOR_ROUTE_PATTERN_TOKEN.TEMPLATE_QUERY_ID
71
71
  ];
72
72
 
73
73
  return (
74
74
  <DataSpaceTemplateQueryCreatorStoreProvider
75
75
  gav={gav}
76
76
  dataSpacePath={dataSpacePath}
77
- templateQueryTitle={templateQueryTitle}
77
+ templateQueryId={templateQueryId}
78
78
  >
79
79
  <QueryEditor />
80
80
  </DataSpaceTemplateQueryCreatorStoreProvider>
@@ -48,7 +48,10 @@ import {
48
48
  } from '../../graph/metamodel/pure/model/packageableElements/dataSpace/DSL_DataSpace_DataSpace.js';
49
49
  import { DSL_DATA_SPACE_LEGEND_STUDIO_DOCUMENTATION_KEY } from '../../__lib__/studio/DSL_DataSpace_LegendStudioDocumentation.js';
50
50
  import { SIMPLE_DATA_SPACE_SNIPPET } from '../../__lib__/studio/DSL_DataSpace_LegendStudioCodeSnippet.js';
51
- import type { DocumentationEntry } from '@finos/legend-application';
51
+ import type {
52
+ ApplicationPageEntry,
53
+ DocumentationEntry,
54
+ } from '@finos/legend-application';
52
55
  import { DataSpaceIcon } from '../DSL_DataSpace_Icon.js';
53
56
  import { DataSpacePreviewState } from '../../stores/studio/DataSpacePreviewState.js';
54
57
  import {
@@ -57,6 +60,8 @@ import {
57
60
  } from './DataSpacePreviewAction.js';
58
61
  import type { PureGrammarTextSuggestion } from '@finos/legend-lego/code-editor';
59
62
  import { DataSpaceQueryAction } from './DataSpaceQueryAction.js';
63
+ import { DataSpaceTemplateQueryPromotionReviewer } from './DataSpaceTemplateQueryPromoteReview.js';
64
+ import { DATA_SPACE_QUERY_ROUTE_PATTERN } from '../../__lib__/query/DSL_DataSpace_LegendQueryNavigation.js';
60
65
 
61
66
  const DATA_SPACE_ELEMENT_TYPE = 'DATA SPACE';
62
67
  const DATA_SPACE_ELEMENT_PROJECT_EXPLORER_DND_TYPE =
@@ -80,6 +85,18 @@ export class DSL_DataSpace_LegendStudioApplicationPlugin
80
85
  ];
81
86
  }
82
87
 
88
+ override getExtraApplicationPageEntries(): ApplicationPageEntry[] {
89
+ return [
90
+ {
91
+ key: 'promote-as-curated-template-query-page',
92
+ addressPatterns: [
93
+ DATA_SPACE_QUERY_ROUTE_PATTERN.PROMOTE_TEMPLATE_QUERY,
94
+ ],
95
+ renderer: DataSpaceTemplateQueryPromotionReviewer,
96
+ },
97
+ ];
98
+ }
99
+
83
100
  override getExtraExplorerContextMenuItemRendererConfigurations(): ExplorerContextMenuItemRendererConfiguration[] {
84
101
  return [
85
102
  {