@finos/legend-application-query 13.4.11 → 13.4.13
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/__lib__/LegendQueryUserDataHelper.js.map +1 -1
- package/lib/components/CloneQueryServiceSetup.js.map +1 -1
- package/lib/components/Core_LegendQueryApplicationPlugin.d.ts +3 -0
- package/lib/components/Core_LegendQueryApplicationPlugin.d.ts.map +1 -1
- package/lib/components/Core_LegendQueryApplicationPlugin.js +250 -5
- package/lib/components/Core_LegendQueryApplicationPlugin.js.map +1 -1
- package/lib/components/CreateMappingQuerySetup.js.map +1 -1
- package/lib/components/LoadProjectServiceQuerySetup.js.map +1 -1
- package/lib/components/QueryEditor.d.ts +8 -0
- package/lib/components/QueryEditor.d.ts.map +1 -1
- package/lib/components/QueryEditor.js +15 -136
- package/lib/components/QueryEditor.js.map +1 -1
- package/lib/components/QueryEdtiorExistingQueryVersionRevertModal.js.map +1 -1
- package/lib/components/QuerySetup.js.map +1 -1
- package/lib/components/UpdateExistingServiceQuerySetup.js.map +1 -1
- package/lib/components/__test-utils__/QueryEditorComponentTestUtils.d.ts.map +1 -1
- package/lib/components/__test-utils__/QueryEditorComponentTestUtils.js +2 -0
- package/lib/components/__test-utils__/QueryEditorComponentTestUtils.js.map +1 -1
- package/lib/components/data-space/DataSpaceQuerySetup.d.ts.map +1 -1
- package/lib/components/data-space/DataSpaceQuerySetup.js +7 -6
- package/lib/components/data-space/DataSpaceQuerySetup.js.map +1 -1
- package/lib/index.css +2 -2
- package/lib/index.css.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/package.json +12 -12
- package/lib/stores/CloneServiceQuerySetupStore.js.map +1 -1
- package/lib/stores/CreateMappingQuerySetupStore.js.map +1 -1
- package/lib/stores/LegendQueryApplicationPlugin.d.ts +4 -4
- package/lib/stores/LegendQueryApplicationPlugin.d.ts.map +1 -1
- package/lib/stores/LegendQueryApplicationPlugin.js +1 -0
- package/lib/stores/LegendQueryApplicationPlugin.js.map +1 -1
- package/lib/stores/LegendQueryBaseStore.js.map +1 -1
- package/lib/stores/LoadProjectServiceQuerySetupStore.js.map +1 -1
- package/lib/stores/QueryEditorStore.d.ts +5 -1
- package/lib/stores/QueryEditorStore.d.ts.map +1 -1
- package/lib/stores/QueryEditorStore.js +12 -4
- package/lib/stores/QueryEditorStore.js.map +1 -1
- package/lib/stores/QueryProductionizerSetupStore.js.map +1 -1
- package/lib/stores/QuerySetupStore.js.map +1 -1
- package/lib/stores/UpdateExistingServiceQuerySetupStore.js.map +1 -1
- package/lib/stores/__test-utils__/LegendQueryApplicationTestUtils.js +1 -1
- package/lib/stores/__test-utils__/LegendQueryApplicationTestUtils.js.map +1 -1
- package/lib/stores/data-space/DataSpaceQueryCreatorStore.d.ts.map +1 -1
- package/lib/stores/data-space/DataSpaceQueryCreatorStore.js +2 -2
- package/lib/stores/data-space/DataSpaceQueryCreatorStore.js.map +1 -1
- package/lib/stores/data-space/DataSpaceQuerySetupState.d.ts +2 -1
- package/lib/stores/data-space/DataSpaceQuerySetupState.d.ts.map +1 -1
- package/lib/stores/data-space/DataSpaceQuerySetupState.js +6 -3
- package/lib/stores/data-space/DataSpaceQuerySetupState.js.map +1 -1
- package/lib/stores/data-space/DataSpaceTemplateQueryCreatorStore.d.ts.map +1 -1
- package/lib/stores/data-space/DataSpaceTemplateQueryCreatorStore.js +2 -2
- package/lib/stores/data-space/DataSpaceTemplateQueryCreatorStore.js.map +1 -1
- package/package.json +22 -22
- package/src/components/CloneQueryServiceSetup.tsx +6 -6
- package/src/components/Core_LegendQueryApplicationPlugin.tsx +593 -1
- package/src/components/CreateMappingQuerySetup.tsx +8 -8
- package/src/components/LoadProjectServiceQuerySetup.tsx +4 -4
- package/src/components/QueryEditor.tsx +30 -468
- package/src/components/__test-utils__/QueryEditorComponentTestUtils.tsx +2 -0
- package/src/components/data-space/DataSpaceQuerySetup.tsx +52 -53
- package/src/index.ts +2 -1
- package/src/stores/{LegendQueryApplicationPlugin.ts → LegendQueryApplicationPlugin.tsx} +11 -6
- package/src/stores/QueryEditorStore.ts +16 -0
- package/src/stores/__test-utils__/LegendQueryApplicationTestUtils.ts +1 -1
- package/src/stores/data-space/DataSpaceQueryCreatorStore.ts +2 -0
- package/src/stores/data-space/DataSpaceQuerySetupState.ts +8 -0
- package/src/stores/data-space/DataSpaceTemplateQueryCreatorStore.ts +2 -0
- package/tsconfig.json +19 -3
- package/tsconfig.package.json +17 -1
@@ -23,10 +23,22 @@ import packageJson from '../../package.json' assert { type: 'json' };
|
|
23
23
|
import type { QuerySetupLandingPageStore } from '../stores/QuerySetupStore.js';
|
24
24
|
import {
|
25
25
|
ArrowCircleUpIcon,
|
26
|
+
Button,
|
27
|
+
CaretDownIcon,
|
28
|
+
CheckIcon,
|
26
29
|
DroidIcon,
|
30
|
+
DropdownMenu,
|
31
|
+
EmptyLightBulbIcon,
|
32
|
+
LightBulbIcon,
|
27
33
|
ManageSearchIcon,
|
34
|
+
MenuContent,
|
35
|
+
MenuContentItem,
|
36
|
+
MenuContentItemIcon,
|
37
|
+
MenuContentItemLabel,
|
28
38
|
PlusIcon,
|
29
39
|
RobotIcon,
|
40
|
+
SaveAsIcon,
|
41
|
+
SaveCurrIcon,
|
30
42
|
SquareIcon,
|
31
43
|
} from '@finos/legend-art';
|
32
44
|
import {
|
@@ -34,11 +46,13 @@ import {
|
|
34
46
|
generateCreateMappingQuerySetupRoute,
|
35
47
|
generateEditExistingQuerySetupRoute,
|
36
48
|
generateLoadProjectServiceQuerySetup,
|
49
|
+
generateMappingQueryCreatorRoute,
|
37
50
|
generateQueryProductionizerSetupRoute,
|
38
51
|
generateUpdateExistingServiceQuerySetup,
|
39
52
|
LEGEND_QUERY_ROUTE_PATTERN,
|
40
53
|
} from '../__lib__/LegendQueryNavigation.js';
|
41
54
|
import {
|
55
|
+
LEGEND_APPLICATION_COLOR_THEME,
|
42
56
|
type ApplicationPageEntry,
|
43
57
|
type LegendApplicationSetup,
|
44
58
|
} from '@finos/legend-application';
|
@@ -50,7 +64,30 @@ import {
|
|
50
64
|
configureCodeEditorComponent,
|
51
65
|
setupPureLanguageService,
|
52
66
|
} from '@finos/legend-lego/code-editor';
|
53
|
-
import {
|
67
|
+
import {
|
68
|
+
generateDataSpaceQueryCreatorRoute,
|
69
|
+
generateDataSpaceQuerySetupRoute,
|
70
|
+
} from '../__lib__/DSL_DataSpace_LegendQueryNavigation.js';
|
71
|
+
import type { QueryBuilderHeaderActionConfiguration } from '@finos/legend-query-builder';
|
72
|
+
import {
|
73
|
+
ExistingQueryEditorStore,
|
74
|
+
QueryBuilderActionConfig_QueryApplication,
|
75
|
+
createViewProjectHandler,
|
76
|
+
createViewSDLCProjectHandler,
|
77
|
+
} from '../stores/QueryEditorStore.js';
|
78
|
+
import {
|
79
|
+
DataSpaceQueryBuilderState,
|
80
|
+
generateDataSpaceTemplateQueryPromotionRoute,
|
81
|
+
} from '@finos/legend-extension-dsl-data-space/application';
|
82
|
+
import { RuntimePointer } from '@finos/legend-graph';
|
83
|
+
import { QUERY_DOCUMENTATION_KEY } from '../application/LegendQueryDocumentation.js';
|
84
|
+
import { LegendQueryTelemetryHelper } from '../__lib__/LegendQueryTelemetryHelper.js';
|
85
|
+
import { StoreProjectData } from '@finos/legend-server-depot';
|
86
|
+
import { buildUrl } from '@finos/legend-shared';
|
87
|
+
import { parseProjectIdentifier } from '@finos/legend-storage';
|
88
|
+
import { QUERY_EDITOR_TEST_ID } from '../__lib__/LegendQueryTesting.js';
|
89
|
+
import { QueryEditorExistingQueryHeader } from './QueryEditor.js';
|
90
|
+
import { DataSpaceTemplateQueryCreatorStore } from '../stores/data-space/DataSpaceTemplateQueryCreatorStore.js';
|
54
91
|
|
55
92
|
export class Core_LegendQueryApplicationPlugin extends LegendQueryApplicationPlugin {
|
56
93
|
static NAME = packageJson.extensions.applicationQueryPlugin;
|
@@ -203,4 +240,559 @@ export class Core_LegendQueryApplicationPlugin extends LegendQueryApplicationPlu
|
|
203
240
|
},
|
204
241
|
];
|
205
242
|
}
|
243
|
+
|
244
|
+
getExtraQueryBuilderHeaderActionConfigurations?(): QueryBuilderHeaderActionConfiguration[] {
|
245
|
+
return [
|
246
|
+
{
|
247
|
+
key: 'promote-as-template-query',
|
248
|
+
category: 0,
|
249
|
+
renderer: (queryBuilderState): React.ReactNode => {
|
250
|
+
if (
|
251
|
+
queryBuilderState.workflowState.actionConfig instanceof
|
252
|
+
QueryBuilderActionConfig_QueryApplication
|
253
|
+
) {
|
254
|
+
const editorStore =
|
255
|
+
queryBuilderState.workflowState.actionConfig.editorStore;
|
256
|
+
const proceedCuratedTemplateQueryPromotion =
|
257
|
+
async (): Promise<void> => {
|
258
|
+
if (
|
259
|
+
!(
|
260
|
+
editorStore instanceof ExistingQueryEditorStore &&
|
261
|
+
queryBuilderState instanceof DataSpaceQueryBuilderState
|
262
|
+
)
|
263
|
+
) {
|
264
|
+
return;
|
265
|
+
}
|
266
|
+
// fetch project data
|
267
|
+
const project = StoreProjectData.serialization.fromJson(
|
268
|
+
await editorStore.depotServerClient.getProject(
|
269
|
+
editorStore.lightQuery.groupId,
|
270
|
+
editorStore.lightQuery.artifactId,
|
271
|
+
),
|
272
|
+
);
|
273
|
+
|
274
|
+
// find the matching SDLC instance
|
275
|
+
const projectIDPrefix = parseProjectIdentifier(
|
276
|
+
project.projectId,
|
277
|
+
).prefix;
|
278
|
+
const matchingSDLCEntry =
|
279
|
+
editorStore.applicationStore.config.studioInstances.find(
|
280
|
+
(entry) => entry.sdlcProjectIDPrefix === projectIDPrefix,
|
281
|
+
);
|
282
|
+
if (matchingSDLCEntry) {
|
283
|
+
editorStore.applicationStore.navigationService.navigator.visitAddress(
|
284
|
+
buildUrl([
|
285
|
+
editorStore.applicationStore.config.studioApplicationUrl,
|
286
|
+
generateDataSpaceTemplateQueryPromotionRoute(
|
287
|
+
editorStore.lightQuery.groupId,
|
288
|
+
editorStore.lightQuery.artifactId,
|
289
|
+
editorStore.lightQuery.versionId,
|
290
|
+
queryBuilderState.dataSpace.path,
|
291
|
+
editorStore.lightQuery.id,
|
292
|
+
),
|
293
|
+
]),
|
294
|
+
);
|
295
|
+
} else {
|
296
|
+
editorStore.applicationStore.notificationService.notifyWarning(
|
297
|
+
`Can't find the corresponding SDLC instance to productionize the query`,
|
298
|
+
);
|
299
|
+
}
|
300
|
+
};
|
301
|
+
const proceedTemplate = (): void => {
|
302
|
+
queryBuilderState.changeDetectionState.alertUnsavedChanges(() => {
|
303
|
+
proceedCuratedTemplateQueryPromotion().catch(
|
304
|
+
editorStore.applicationStore.alertUnhandledError,
|
305
|
+
);
|
306
|
+
});
|
307
|
+
};
|
308
|
+
return (
|
309
|
+
<>
|
310
|
+
{editorStore instanceof ExistingQueryEditorStore &&
|
311
|
+
queryBuilderState instanceof DataSpaceQueryBuilderState && (
|
312
|
+
<button
|
313
|
+
className="query-editor__header__action btn--dark"
|
314
|
+
tabIndex={-1}
|
315
|
+
onClick={proceedTemplate}
|
316
|
+
title={
|
317
|
+
!(editorStore instanceof ExistingQueryEditorStore)
|
318
|
+
? 'Please save your query first before promoting'
|
319
|
+
: 'Promote Curated Template query...'
|
320
|
+
}
|
321
|
+
>
|
322
|
+
<ArrowCircleUpIcon className="query-editor__header__action__icon--productionize" />
|
323
|
+
<div className="query-editor__header__action__label">
|
324
|
+
Promote as Template Query
|
325
|
+
</div>
|
326
|
+
</button>
|
327
|
+
)}
|
328
|
+
</>
|
329
|
+
);
|
330
|
+
}
|
331
|
+
return undefined;
|
332
|
+
},
|
333
|
+
},
|
334
|
+
{
|
335
|
+
key: 'load-query',
|
336
|
+
category: 0,
|
337
|
+
renderer: (queryBuilderState): React.ReactNode => {
|
338
|
+
if (
|
339
|
+
queryBuilderState.workflowState.actionConfig instanceof
|
340
|
+
QueryBuilderActionConfig_QueryApplication
|
341
|
+
) {
|
342
|
+
const editorStore =
|
343
|
+
queryBuilderState.workflowState.actionConfig.editorStore;
|
344
|
+
const openQueryLoader = (): void => {
|
345
|
+
editorStore.queryLoaderState.setQueryLoaderDialogOpen(true);
|
346
|
+
};
|
347
|
+
return (
|
348
|
+
<Button
|
349
|
+
className="query-editor__header__action btn--dark"
|
350
|
+
disabled={editorStore.isPerformingBlockingAction}
|
351
|
+
onClick={openQueryLoader}
|
352
|
+
title="Load query..."
|
353
|
+
>
|
354
|
+
<ManageSearchIcon className="query-editor__header__action__icon--load" />
|
355
|
+
<div className="query-editor__header__action__label">
|
356
|
+
Load Query
|
357
|
+
</div>
|
358
|
+
</Button>
|
359
|
+
);
|
360
|
+
}
|
361
|
+
return undefined;
|
362
|
+
},
|
363
|
+
},
|
364
|
+
{
|
365
|
+
key: 'new-query',
|
366
|
+
category: 0,
|
367
|
+
renderer: (queryBuilderState): React.ReactNode => {
|
368
|
+
if (
|
369
|
+
queryBuilderState.workflowState.actionConfig instanceof
|
370
|
+
QueryBuilderActionConfig_QueryApplication
|
371
|
+
) {
|
372
|
+
const editorStore =
|
373
|
+
queryBuilderState.workflowState.actionConfig.editorStore;
|
374
|
+
const isExistingQuery =
|
375
|
+
editorStore instanceof ExistingQueryEditorStore;
|
376
|
+
const handleNewQuery = (): void => {
|
377
|
+
if (editorStore instanceof ExistingQueryEditorStore) {
|
378
|
+
const query = editorStore.query;
|
379
|
+
if (query) {
|
380
|
+
if (queryBuilderState instanceof DataSpaceQueryBuilderState) {
|
381
|
+
editorStore.applicationStore.navigationService.navigator.goToLocation(
|
382
|
+
generateDataSpaceQueryCreatorRoute(
|
383
|
+
query.groupId,
|
384
|
+
query.artifactId,
|
385
|
+
query.versionId,
|
386
|
+
queryBuilderState.dataSpace.path,
|
387
|
+
queryBuilderState.executionContext.name,
|
388
|
+
undefined,
|
389
|
+
undefined,
|
390
|
+
),
|
391
|
+
);
|
392
|
+
} else {
|
393
|
+
const mapping =
|
394
|
+
editorStore.queryBuilderState?.executionContextState
|
395
|
+
.mapping;
|
396
|
+
const runtime =
|
397
|
+
editorStore.queryBuilderState?.executionContextState
|
398
|
+
.runtimeValue;
|
399
|
+
if (mapping && runtime instanceof RuntimePointer) {
|
400
|
+
editorStore.applicationStore.navigationService.navigator.goToLocation(
|
401
|
+
generateMappingQueryCreatorRoute(
|
402
|
+
query.groupId,
|
403
|
+
query.artifactId,
|
404
|
+
query.versionId,
|
405
|
+
mapping.path,
|
406
|
+
runtime.packageableRuntime.value.path,
|
407
|
+
),
|
408
|
+
);
|
409
|
+
}
|
410
|
+
}
|
411
|
+
}
|
412
|
+
}
|
413
|
+
};
|
414
|
+
return (
|
415
|
+
<>
|
416
|
+
{isExistingQuery && (
|
417
|
+
<Button
|
418
|
+
className="query-editor__header__action btn--dark"
|
419
|
+
disabled={editorStore.isPerformingBlockingAction}
|
420
|
+
onClick={handleNewQuery}
|
421
|
+
title="New query"
|
422
|
+
>
|
423
|
+
<SaveCurrIcon />
|
424
|
+
<div className="query-editor__header__action__label">
|
425
|
+
New Query
|
426
|
+
</div>
|
427
|
+
</Button>
|
428
|
+
)}
|
429
|
+
</>
|
430
|
+
);
|
431
|
+
}
|
432
|
+
return undefined;
|
433
|
+
},
|
434
|
+
},
|
435
|
+
{
|
436
|
+
key: 'save-query',
|
437
|
+
category: 0,
|
438
|
+
renderer: (queryBuilderState): React.ReactNode => {
|
439
|
+
if (
|
440
|
+
queryBuilderState.workflowState.actionConfig instanceof
|
441
|
+
QueryBuilderActionConfig_QueryApplication
|
442
|
+
) {
|
443
|
+
const editorStore =
|
444
|
+
queryBuilderState.workflowState.actionConfig.editorStore;
|
445
|
+
const isExistingQuery =
|
446
|
+
editorStore instanceof ExistingQueryEditorStore;
|
447
|
+
const openSaveQueryModal = (): void => {
|
448
|
+
if (editorStore instanceof ExistingQueryEditorStore) {
|
449
|
+
editorStore.updateState.showSaveModal();
|
450
|
+
}
|
451
|
+
};
|
452
|
+
|
453
|
+
return (
|
454
|
+
<Button
|
455
|
+
className="query-editor__header__action btn--dark"
|
456
|
+
disabled={
|
457
|
+
!isExistingQuery ||
|
458
|
+
editorStore.isPerformingBlockingAction ||
|
459
|
+
!queryBuilderState.canBuildQuery
|
460
|
+
}
|
461
|
+
onClick={openSaveQueryModal}
|
462
|
+
title={
|
463
|
+
!queryBuilderState.canBuildQuery
|
464
|
+
? 'Please fix query errors before saving'
|
465
|
+
: 'Save query'
|
466
|
+
}
|
467
|
+
>
|
468
|
+
<SaveCurrIcon />
|
469
|
+
<div className="query-editor__header__action__label">Save</div>
|
470
|
+
</Button>
|
471
|
+
);
|
472
|
+
}
|
473
|
+
return undefined;
|
474
|
+
},
|
475
|
+
},
|
476
|
+
{
|
477
|
+
key: 'save-as',
|
478
|
+
category: 0,
|
479
|
+
renderer: (queryBuilderState): React.ReactNode => {
|
480
|
+
if (
|
481
|
+
queryBuilderState.workflowState.actionConfig instanceof
|
482
|
+
QueryBuilderActionConfig_QueryApplication
|
483
|
+
) {
|
484
|
+
const editorStore =
|
485
|
+
queryBuilderState.workflowState.actionConfig.editorStore;
|
486
|
+
const handleQuerySaveAs = (): void => {
|
487
|
+
editorStore.queryCreatorState.open(
|
488
|
+
editorStore instanceof ExistingQueryEditorStore
|
489
|
+
? editorStore.query
|
490
|
+
: undefined,
|
491
|
+
);
|
492
|
+
};
|
493
|
+
return (
|
494
|
+
<Button
|
495
|
+
className="query-editor__header__action btn--dark"
|
496
|
+
disabled={
|
497
|
+
editorStore.isPerformingBlockingAction ||
|
498
|
+
!queryBuilderState.canBuildQuery
|
499
|
+
}
|
500
|
+
onClick={handleQuerySaveAs}
|
501
|
+
title={
|
502
|
+
!queryBuilderState.canBuildQuery
|
503
|
+
? 'Please fix query errors before saving'
|
504
|
+
: 'Save as new query'
|
505
|
+
}
|
506
|
+
>
|
507
|
+
<SaveAsIcon />
|
508
|
+
<div className="query-editor__header__action__label">
|
509
|
+
Save As...
|
510
|
+
</div>
|
511
|
+
</Button>
|
512
|
+
);
|
513
|
+
}
|
514
|
+
return undefined;
|
515
|
+
},
|
516
|
+
},
|
517
|
+
{
|
518
|
+
key: 'help',
|
519
|
+
category: 0,
|
520
|
+
renderer: (queryBuilderState): React.ReactNode => {
|
521
|
+
if (
|
522
|
+
queryBuilderState.workflowState.actionConfig instanceof
|
523
|
+
QueryBuilderActionConfig_QueryApplication
|
524
|
+
) {
|
525
|
+
const editorStore =
|
526
|
+
queryBuilderState.workflowState.actionConfig.editorStore;
|
527
|
+
const queryDocEntry =
|
528
|
+
editorStore.applicationStore.documentationService.getDocEntry(
|
529
|
+
QUERY_DOCUMENTATION_KEY.TUTORIAL_QUERY_BUILDER,
|
530
|
+
);
|
531
|
+
const toggleAssistant = (): void =>
|
532
|
+
editorStore.applicationStore.assistantService.toggleAssistant();
|
533
|
+
|
534
|
+
const openQueryTutorial = (): void => {
|
535
|
+
if (queryDocEntry?.url) {
|
536
|
+
editorStore.applicationStore.navigationService.navigator.visitAddress(
|
537
|
+
queryDocEntry.url,
|
538
|
+
);
|
539
|
+
}
|
540
|
+
};
|
541
|
+
const extraHelpMenuContentItems =
|
542
|
+
editorStore.applicationStore.pluginManager
|
543
|
+
.getApplicationPlugins()
|
544
|
+
.flatMap(
|
545
|
+
(plugin) =>
|
546
|
+
plugin.getExtraQueryEditorHelpMenuActionConfigurations?.() ??
|
547
|
+
[],
|
548
|
+
)
|
549
|
+
.map((item) => (
|
550
|
+
<MenuContentItem
|
551
|
+
key={item.key}
|
552
|
+
title={item.title ?? ''}
|
553
|
+
onClick={() => item.onClick(editorStore)}
|
554
|
+
>
|
555
|
+
{item.icon && (
|
556
|
+
<MenuContentItemIcon>{item.icon}</MenuContentItemIcon>
|
557
|
+
)}
|
558
|
+
<MenuContentItemLabel>{item.label}</MenuContentItemLabel>
|
559
|
+
</MenuContentItem>
|
560
|
+
));
|
561
|
+
return (
|
562
|
+
<DropdownMenu
|
563
|
+
className="query-editor__header__action btn--dark"
|
564
|
+
disabled={editorStore.isViewProjectActionDisabled}
|
565
|
+
content={
|
566
|
+
<MenuContent>
|
567
|
+
{extraHelpMenuContentItems}
|
568
|
+
{queryDocEntry && (
|
569
|
+
<MenuContentItem onClick={openQueryTutorial}>
|
570
|
+
<MenuContentItemIcon>{null}</MenuContentItemIcon>
|
571
|
+
<MenuContentItemLabel>
|
572
|
+
Open Documentation
|
573
|
+
</MenuContentItemLabel>
|
574
|
+
</MenuContentItem>
|
575
|
+
)}
|
576
|
+
|
577
|
+
<MenuContentItem onClick={toggleAssistant}>
|
578
|
+
<MenuContentItemIcon>
|
579
|
+
{!editorStore.applicationStore.assistantService
|
580
|
+
.isHidden ? (
|
581
|
+
<CheckIcon />
|
582
|
+
) : null}
|
583
|
+
</MenuContentItemIcon>
|
584
|
+
<MenuContentItemLabel>
|
585
|
+
Show Virtual Assistant
|
586
|
+
</MenuContentItemLabel>
|
587
|
+
</MenuContentItem>
|
588
|
+
</MenuContent>
|
589
|
+
}
|
590
|
+
>
|
591
|
+
<div
|
592
|
+
className="query-editor__header__action__label"
|
593
|
+
title="See more options"
|
594
|
+
>
|
595
|
+
Help...
|
596
|
+
</div>
|
597
|
+
<CaretDownIcon className="query-editor__header__action__dropdown-trigger" />
|
598
|
+
</DropdownMenu>
|
599
|
+
);
|
600
|
+
}
|
601
|
+
return undefined;
|
602
|
+
},
|
603
|
+
},
|
604
|
+
{
|
605
|
+
key: 'toggle-theme',
|
606
|
+
category: 0,
|
607
|
+
renderer: (queryBuilderState): React.ReactNode => {
|
608
|
+
if (
|
609
|
+
queryBuilderState.workflowState.actionConfig instanceof
|
610
|
+
QueryBuilderActionConfig_QueryApplication
|
611
|
+
) {
|
612
|
+
const editorStore =
|
613
|
+
queryBuilderState.workflowState.actionConfig.editorStore;
|
614
|
+
const applicationStore = editorStore.applicationStore;
|
615
|
+
const TEMPORARY__toggleLightDarkMode = (): void => {
|
616
|
+
applicationStore.layoutService.setColorTheme(
|
617
|
+
applicationStore.layoutService
|
618
|
+
.TEMPORARY__isLightColorThemeEnabled
|
619
|
+
? LEGEND_APPLICATION_COLOR_THEME.DEFAULT_DARK
|
620
|
+
: LEGEND_APPLICATION_COLOR_THEME.LEGACY_LIGHT,
|
621
|
+
{ persist: true },
|
622
|
+
);
|
623
|
+
};
|
624
|
+
return (
|
625
|
+
<button
|
626
|
+
title="Toggle light/dark mode"
|
627
|
+
onClick={TEMPORARY__toggleLightDarkMode}
|
628
|
+
className="query-editor__header__action query-editor__header__action__theme-toggler"
|
629
|
+
>
|
630
|
+
{applicationStore.layoutService
|
631
|
+
.TEMPORARY__isLightColorThemeEnabled ? (
|
632
|
+
<>
|
633
|
+
<LightBulbIcon className="query-editor__header__action__icon--bulb--light" />
|
634
|
+
</>
|
635
|
+
) : (
|
636
|
+
<>
|
637
|
+
<EmptyLightBulbIcon className="query-editor__header__action__icon--bulb--dark" />
|
638
|
+
</>
|
639
|
+
)}
|
640
|
+
</button>
|
641
|
+
);
|
642
|
+
}
|
643
|
+
return undefined;
|
644
|
+
},
|
645
|
+
},
|
646
|
+
{
|
647
|
+
key: 'more-actions',
|
648
|
+
category: 0,
|
649
|
+
renderer: (queryBuilderState): React.ReactNode => {
|
650
|
+
if (
|
651
|
+
queryBuilderState.workflowState.actionConfig instanceof
|
652
|
+
QueryBuilderActionConfig_QueryApplication
|
653
|
+
) {
|
654
|
+
const editorStore =
|
655
|
+
queryBuilderState.workflowState.actionConfig.editorStore;
|
656
|
+
const isExistingQuery =
|
657
|
+
editorStore instanceof ExistingQueryEditorStore;
|
658
|
+
const renameQuery = (): void => {
|
659
|
+
if (editorStore instanceof ExistingQueryEditorStore) {
|
660
|
+
editorStore.updateState.setQueryRenamer(true);
|
661
|
+
}
|
662
|
+
};
|
663
|
+
const showQueryInfo = (): void => {
|
664
|
+
if (editorStore instanceof ExistingQueryEditorStore) {
|
665
|
+
editorStore.updateState.setShowQueryInfo(true);
|
666
|
+
}
|
667
|
+
};
|
668
|
+
const viewProject = (): void => {
|
669
|
+
LegendQueryTelemetryHelper.logEvent_QueryViewProjectLaunched(
|
670
|
+
editorStore.applicationStore.telemetryService,
|
671
|
+
);
|
672
|
+
const { groupId, artifactId, versionId } =
|
673
|
+
editorStore.getProjectInfo();
|
674
|
+
createViewProjectHandler(editorStore.applicationStore)(
|
675
|
+
groupId,
|
676
|
+
artifactId,
|
677
|
+
versionId,
|
678
|
+
undefined,
|
679
|
+
);
|
680
|
+
};
|
681
|
+
const viewSDLCProject = (): void => {
|
682
|
+
LegendQueryTelemetryHelper.logEvent_QueryViewSdlcProjectLaunched(
|
683
|
+
editorStore.applicationStore.telemetryService,
|
684
|
+
);
|
685
|
+
const { groupId, artifactId } = editorStore.getProjectInfo();
|
686
|
+
createViewSDLCProjectHandler(
|
687
|
+
editorStore.applicationStore,
|
688
|
+
editorStore.depotServerClient,
|
689
|
+
)(groupId, artifactId, undefined).catch(
|
690
|
+
editorStore.applicationStore.alertUnhandledError,
|
691
|
+
);
|
692
|
+
};
|
693
|
+
return (
|
694
|
+
<DropdownMenu
|
695
|
+
className="query-editor__header__action btn--medium"
|
696
|
+
disabled={editorStore.isViewProjectActionDisabled}
|
697
|
+
content={
|
698
|
+
<MenuContent>
|
699
|
+
{isExistingQuery && (
|
700
|
+
<MenuContentItem
|
701
|
+
className="query-editor__header__action__options"
|
702
|
+
onClick={renameQuery}
|
703
|
+
disabled={!isExistingQuery}
|
704
|
+
>
|
705
|
+
Rename Query
|
706
|
+
</MenuContentItem>
|
707
|
+
)}
|
708
|
+
{isExistingQuery && (
|
709
|
+
<MenuContentItem
|
710
|
+
className="query-editor__header__action__options"
|
711
|
+
onClick={showQueryInfo}
|
712
|
+
disabled={!isExistingQuery}
|
713
|
+
>
|
714
|
+
Get Query Info
|
715
|
+
</MenuContentItem>
|
716
|
+
)}
|
717
|
+
<MenuContentItem
|
718
|
+
className="query-editor__header__action__options"
|
719
|
+
disabled={editorStore.isViewProjectActionDisabled}
|
720
|
+
onClick={viewProject}
|
721
|
+
>
|
722
|
+
Go to Project
|
723
|
+
</MenuContentItem>
|
724
|
+
<MenuContentItem
|
725
|
+
className="query-editor__header__action__options"
|
726
|
+
disabled={editorStore.isViewProjectActionDisabled}
|
727
|
+
onClick={viewSDLCProject}
|
728
|
+
>
|
729
|
+
Go to SDLC project
|
730
|
+
</MenuContentItem>
|
731
|
+
</MenuContent>
|
732
|
+
}
|
733
|
+
>
|
734
|
+
<div
|
735
|
+
className="query-editor__header__action__label"
|
736
|
+
title="See more options"
|
737
|
+
>
|
738
|
+
More Actions...
|
739
|
+
</div>
|
740
|
+
<CaretDownIcon className="query-editor__header__action__dropdown-trigger" />
|
741
|
+
</DropdownMenu>
|
742
|
+
);
|
743
|
+
}
|
744
|
+
return undefined;
|
745
|
+
},
|
746
|
+
},
|
747
|
+
];
|
748
|
+
}
|
749
|
+
|
750
|
+
getExtraQueryBuilderHeaderTitleConfigurations?(): QueryBuilderHeaderActionConfiguration {
|
751
|
+
return {
|
752
|
+
key: 'query-title',
|
753
|
+
category: 0,
|
754
|
+
renderer: (queryBuilderState): React.ReactNode => {
|
755
|
+
if (
|
756
|
+
queryBuilderState.workflowState.actionConfig instanceof
|
757
|
+
QueryBuilderActionConfig_QueryApplication
|
758
|
+
) {
|
759
|
+
const editorStore =
|
760
|
+
queryBuilderState.workflowState.actionConfig.editorStore;
|
761
|
+
const renderQueryTitle = (): React.ReactNode => {
|
762
|
+
if (editorStore instanceof ExistingQueryEditorStore) {
|
763
|
+
return (
|
764
|
+
<QueryEditorExistingQueryHeader
|
765
|
+
queryBuilderState={queryBuilderState}
|
766
|
+
existingEditorStore={editorStore}
|
767
|
+
/>
|
768
|
+
);
|
769
|
+
} else if (
|
770
|
+
editorStore instanceof DataSpaceTemplateQueryCreatorStore
|
771
|
+
) {
|
772
|
+
return (
|
773
|
+
<div className="query-editor__dataspace__header">
|
774
|
+
<div className="query-editor__header__content__main query-editor__header__content__title__text query-editor__dataspace__header__title__text">
|
775
|
+
{editorStore.templateQueryTitle}
|
776
|
+
</div>
|
777
|
+
<div className="query-editor__dataspace__header__title__tag">
|
778
|
+
template
|
779
|
+
</div>
|
780
|
+
</div>
|
781
|
+
);
|
782
|
+
}
|
783
|
+
return undefined;
|
784
|
+
};
|
785
|
+
return (
|
786
|
+
<div
|
787
|
+
className="query-editor__header__content"
|
788
|
+
data-testid={QUERY_EDITOR_TEST_ID.QUERY_EDITOR_ACTIONS}
|
789
|
+
>
|
790
|
+
{renderQueryTitle()}
|
791
|
+
</div>
|
792
|
+
);
|
793
|
+
}
|
794
|
+
return undefined;
|
795
|
+
},
|
796
|
+
};
|
797
|
+
}
|
206
798
|
}
|
@@ -130,10 +130,10 @@ const CreateMappingQuerySetupContent = observer(() => {
|
|
130
130
|
const projectSelectorPlaceholder = setupStore.loadProjectsState.isInProgress
|
131
131
|
? 'Loading projects'
|
132
132
|
: setupStore.loadProjectsState.hasFailed
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
133
|
+
? 'Error fetching projects'
|
134
|
+
: setupStore.projects.length
|
135
|
+
? 'Choose a project'
|
136
|
+
: 'You have no projects, please create or acquire access for at least one';
|
137
137
|
const onProjectOptionChange = async (
|
138
138
|
option: ProjectOption | null,
|
139
139
|
): Promise<void> => {
|
@@ -229,8 +229,8 @@ const CreateMappingQuerySetupContent = observer(() => {
|
|
229
229
|
const runtimeSelectorPlaceholder = !setupStore.currentMapping
|
230
230
|
? 'No mapping specified'
|
231
231
|
: runtimeOptions.length
|
232
|
-
|
233
|
-
|
232
|
+
? 'Choose a runtime'
|
233
|
+
: 'No runtime available';
|
234
234
|
const onRuntimeOptionChange = (
|
235
235
|
option: PackageableElementOption<PackageableRuntime> | null,
|
236
236
|
): void => {
|
@@ -331,8 +331,8 @@ const CreateMappingQuerySetupContent = observer(() => {
|
|
331
331
|
{setupStore.surveyMappingRuntimeCompatibilityState.isInProgress
|
332
332
|
? `Surveying runtime and mapping compatibility...`
|
333
333
|
: setupStore.surveyMappingRuntimeCompatibilityState.hasFailed
|
334
|
-
|
335
|
-
|
334
|
+
? `Can't load runtime and mapping`
|
335
|
+
: 'Project and version must be specified'}
|
336
336
|
</BlankPanelContent>
|
337
337
|
</div>
|
338
338
|
)}
|
@@ -76,10 +76,10 @@ const LoadProjectServiceQuerySetupContent = observer(() => {
|
|
76
76
|
const projectSelectorPlaceholder = setupStore.loadProjectsState.isInProgress
|
77
77
|
? 'Loading projects'
|
78
78
|
: setupStore.loadProjectsState.hasFailed
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
79
|
+
? 'Error fetching projects'
|
80
|
+
: setupStore.projects.length
|
81
|
+
? 'Choose a project'
|
82
|
+
: 'You have no projects, please create or acquire access for at least one';
|
83
83
|
const onProjectOptionChange = (option: ProjectOption): void => {
|
84
84
|
setupStore
|
85
85
|
.loadProjectServiceUpdater(option.value)
|