@finos/legend-application-query 13.4.12 → 13.4.13

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 (54) hide show
  1. package/lib/components/Core_LegendQueryApplicationPlugin.d.ts +3 -0
  2. package/lib/components/Core_LegendQueryApplicationPlugin.d.ts.map +1 -1
  3. package/lib/components/Core_LegendQueryApplicationPlugin.js +250 -5
  4. package/lib/components/Core_LegendQueryApplicationPlugin.js.map +1 -1
  5. package/lib/components/QueryEditor.d.ts +8 -0
  6. package/lib/components/QueryEditor.d.ts.map +1 -1
  7. package/lib/components/QueryEditor.js +15 -136
  8. package/lib/components/QueryEditor.js.map +1 -1
  9. package/lib/components/__test-utils__/QueryEditorComponentTestUtils.d.ts.map +1 -1
  10. package/lib/components/__test-utils__/QueryEditorComponentTestUtils.js +2 -0
  11. package/lib/components/__test-utils__/QueryEditorComponentTestUtils.js.map +1 -1
  12. package/lib/components/data-space/DataSpaceQuerySetup.d.ts.map +1 -1
  13. package/lib/components/data-space/DataSpaceQuerySetup.js +7 -6
  14. package/lib/components/data-space/DataSpaceQuerySetup.js.map +1 -1
  15. package/lib/index.css +2 -2
  16. package/lib/index.css.map +1 -1
  17. package/lib/index.d.ts +1 -1
  18. package/lib/index.d.ts.map +1 -1
  19. package/lib/index.js +1 -1
  20. package/lib/index.js.map +1 -1
  21. package/lib/package.json +1 -1
  22. package/lib/stores/LegendQueryApplicationPlugin.d.ts +4 -4
  23. package/lib/stores/LegendQueryApplicationPlugin.d.ts.map +1 -1
  24. package/lib/stores/LegendQueryApplicationPlugin.js +1 -0
  25. package/lib/stores/LegendQueryApplicationPlugin.js.map +1 -1
  26. package/lib/stores/QueryEditorStore.d.ts +5 -1
  27. package/lib/stores/QueryEditorStore.d.ts.map +1 -1
  28. package/lib/stores/QueryEditorStore.js +12 -4
  29. package/lib/stores/QueryEditorStore.js.map +1 -1
  30. package/lib/stores/__test-utils__/LegendQueryApplicationTestUtils.js +1 -1
  31. package/lib/stores/__test-utils__/LegendQueryApplicationTestUtils.js.map +1 -1
  32. package/lib/stores/data-space/DataSpaceQueryCreatorStore.d.ts.map +1 -1
  33. package/lib/stores/data-space/DataSpaceQueryCreatorStore.js +2 -2
  34. package/lib/stores/data-space/DataSpaceQueryCreatorStore.js.map +1 -1
  35. package/lib/stores/data-space/DataSpaceQuerySetupState.d.ts +2 -1
  36. package/lib/stores/data-space/DataSpaceQuerySetupState.d.ts.map +1 -1
  37. package/lib/stores/data-space/DataSpaceQuerySetupState.js +6 -3
  38. package/lib/stores/data-space/DataSpaceQuerySetupState.js.map +1 -1
  39. package/lib/stores/data-space/DataSpaceTemplateQueryCreatorStore.d.ts.map +1 -1
  40. package/lib/stores/data-space/DataSpaceTemplateQueryCreatorStore.js +2 -2
  41. package/lib/stores/data-space/DataSpaceTemplateQueryCreatorStore.js.map +1 -1
  42. package/package.json +6 -6
  43. package/src/components/Core_LegendQueryApplicationPlugin.tsx +593 -1
  44. package/src/components/QueryEditor.tsx +30 -468
  45. package/src/components/__test-utils__/QueryEditorComponentTestUtils.tsx +2 -0
  46. package/src/components/data-space/DataSpaceQuerySetup.tsx +52 -53
  47. package/src/index.ts +2 -1
  48. package/src/stores/{LegendQueryApplicationPlugin.ts → LegendQueryApplicationPlugin.tsx} +11 -6
  49. package/src/stores/QueryEditorStore.ts +16 -0
  50. package/src/stores/__test-utils__/LegendQueryApplicationTestUtils.ts +1 -1
  51. package/src/stores/data-space/DataSpaceQueryCreatorStore.ts +2 -0
  52. package/src/stores/data-space/DataSpaceQuerySetupState.ts +8 -0
  53. package/src/stores/data-space/DataSpaceTemplateQueryCreatorStore.ts +2 -0
  54. package/tsconfig.json +2 -2
@@ -21,7 +21,6 @@ import {
21
21
  DropdownMenu,
22
22
  MenuContent,
23
23
  MenuContentItem,
24
- CaretDownIcon,
25
24
  MenuIcon,
26
25
  MenuContentDivider,
27
26
  MenuContentItemIcon,
@@ -33,21 +32,14 @@ import {
33
32
  ModalFooter,
34
33
  ModalTitle,
35
34
  ModalFooterButton,
36
- ManageSearchIcon,
37
- LightBulbIcon,
38
- EmptyLightBulbIcon,
39
- SaveCurrIcon,
40
- SaveAsIcon,
41
35
  ExclamationTriangleIcon,
42
36
  PanelListItem,
43
- Button,
44
37
  clsx,
45
38
  ModalHeaderActions,
46
39
  TimesIcon,
47
40
  Panel,
48
41
  PanelFullContent,
49
42
  CustomSelectorInput,
50
- ArrowCircleUpIcon,
51
43
  } from '@finos/legend-art';
52
44
  import { observer } from 'mobx-react-lite';
53
45
  import { Fragment, useEffect, useMemo, useRef, useState } from 'react';
@@ -59,17 +51,9 @@ import {
59
51
  LEGEND_QUERY_ROUTE_PATTERN_TOKEN,
60
52
  generateQuerySetupRoute,
61
53
  generateExistingQueryEditorRoute,
62
- generateMappingQueryCreatorRoute,
63
54
  } from '../__lib__/LegendQueryNavigation.js';
64
- import {
65
- createViewProjectHandler,
66
- createViewSDLCProjectHandler,
67
- ExistingQueryEditorStore,
68
- } from '../stores/QueryEditorStore.js';
69
- import {
70
- LEGEND_APPLICATION_COLOR_THEME,
71
- useApplicationStore,
72
- } from '@finos/legend-application';
55
+ import { ExistingQueryEditorStore } from '../stores/QueryEditorStore.js';
56
+ import { useApplicationStore } from '@finos/legend-application';
73
57
  import { useParams } from '@finos/legend-application/browser';
74
58
  import {
75
59
  MappingQueryCreatorStoreProvider,
@@ -78,7 +62,6 @@ import {
78
62
  useQueryEditorStore,
79
63
  } from './QueryEditorStoreProvider.js';
80
64
  import { flowResult } from 'mobx';
81
- import { useLegendQueryApplicationStore } from './LegendQueryFrameworkProvider.js';
82
65
  import {
83
66
  QueryBuilder,
84
67
  QueryBuilderNavigationBlocker,
@@ -86,33 +69,20 @@ import {
86
69
  QueryBuilderDiffViewPanel,
87
70
  type QueryBuilderState,
88
71
  } from '@finos/legend-query-builder';
89
- import { QUERY_DOCUMENTATION_KEY } from '../application/LegendQueryDocumentation.js';
90
- import { buildUrl, debounce } from '@finos/legend-shared';
91
- import { LegendQueryTelemetryHelper } from '../__lib__/LegendQueryTelemetryHelper.js';
92
- import { QUERY_EDITOR_TEST_ID } from '../__lib__/LegendQueryTesting.js';
72
+
93
73
  import {
94
74
  compareSemVerVersions,
95
75
  generateGAVCoordinates,
96
- parseProjectIdentifier,
97
76
  } from '@finos/legend-storage';
98
77
  import {
78
+ type Query,
99
79
  QueryDataSpaceExecutionContext,
100
80
  QueryExplicitExecutionContext,
101
- RuntimePointer,
102
- type Query,
103
81
  } from '@finos/legend-graph';
104
- import {
105
- LATEST_VERSION_ALIAS,
106
- StoreProjectData,
107
- } from '@finos/legend-server-depot';
82
+ import { LATEST_VERSION_ALIAS } from '@finos/legend-server-depot';
108
83
  import { buildVersionOption, type VersionOption } from './QuerySetup.js';
109
84
  import { QueryEditorExistingQueryVersionRevertModal } from './QueryEdtiorExistingQueryVersionRevertModal.js';
110
- import {
111
- DataSpaceQueryBuilderState,
112
- generateDataSpaceTemplateQueryPromotionRoute,
113
- } from '@finos/legend-extension-dsl-data-space/application';
114
- import { generateDataSpaceQueryCreatorRoute } from '../__lib__/DSL_DataSpace_LegendQueryNavigation.js';
115
- import { DataSpaceTemplateQueryCreatorStore } from '../stores/data-space/DataSpaceTemplateQueryCreatorStore.js';
85
+ import { debounce } from '@finos/legend-shared';
116
86
 
117
87
  const CreateQueryDialog = observer(() => {
118
88
  const editorStore = useQueryEditorStore();
@@ -281,7 +251,7 @@ const SaveQueryDialog = observer(
281
251
  },
282
252
  );
283
253
 
284
- const QueryEditorExistingQueryHeader = observer(
254
+ export const QueryEditorExistingQueryHeader = observer(
285
255
  (props: {
286
256
  queryBuilderState: QueryBuilderState;
287
257
  existingEditorStore: ExistingQueryEditorStore;
@@ -576,435 +546,11 @@ const QueryEditorExistingQueryInfoModal = observer(
576
546
  },
577
547
  );
578
548
 
579
- const QueryEditorHeaderContent = observer(
580
- (props: { queryBuilderState: QueryBuilderState }) => {
581
- const { queryBuilderState } = props;
582
- const editorStore = useQueryEditorStore();
583
- const applicationStore = useLegendQueryApplicationStore();
584
- const isExistingQuery = editorStore instanceof ExistingQueryEditorStore;
585
- const renameQuery = (): void => {
586
- if (editorStore instanceof ExistingQueryEditorStore) {
587
- editorStore.updateState.setQueryRenamer(true);
588
- }
589
- };
590
- const showQueryInfo = (): void => {
591
- if (editorStore instanceof ExistingQueryEditorStore) {
592
- editorStore.updateState.setShowQueryInfo(true);
593
- }
594
- };
595
- // actions
596
- const openQueryLoader = (): void => {
597
- editorStore.queryLoaderState.setQueryLoaderDialogOpen(true);
598
- };
599
- const viewProject = (): void => {
600
- LegendQueryTelemetryHelper.logEvent_QueryViewProjectLaunched(
601
- editorStore.applicationStore.telemetryService,
602
- );
603
- const { groupId, artifactId, versionId } = editorStore.getProjectInfo();
604
- createViewProjectHandler(applicationStore)(
605
- groupId,
606
- artifactId,
607
- versionId,
608
- undefined,
609
- );
610
- };
611
- const viewSDLCProject = (): void => {
612
- LegendQueryTelemetryHelper.logEvent_QueryViewSdlcProjectLaunched(
613
- editorStore.applicationStore.telemetryService,
614
- );
615
- const { groupId, artifactId } = editorStore.getProjectInfo();
616
- createViewSDLCProjectHandler(
617
- applicationStore,
618
- editorStore.depotServerClient,
619
- )(groupId, artifactId, undefined).catch(
620
- applicationStore.alertUnhandledError,
621
- );
622
- };
623
- const TEMPORARY__toggleLightDarkMode = (): void => {
624
- applicationStore.layoutService.setColorTheme(
625
- applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
626
- ? LEGEND_APPLICATION_COLOR_THEME.DEFAULT_DARK
627
- : LEGEND_APPLICATION_COLOR_THEME.LEGACY_LIGHT,
628
- { persist: true },
629
- );
630
- };
631
-
632
- const openSaveQueryModal = (): void => {
633
- if (editorStore instanceof ExistingQueryEditorStore) {
634
- editorStore.updateState.showSaveModal();
635
- }
636
- };
637
-
638
- const handleNewQuery = (): void => {
639
- if (editorStore instanceof ExistingQueryEditorStore) {
640
- const query = editorStore.query;
641
- if (query) {
642
- if (queryBuilderState instanceof DataSpaceQueryBuilderState) {
643
- editorStore.applicationStore.navigationService.navigator.goToLocation(
644
- generateDataSpaceQueryCreatorRoute(
645
- query.groupId,
646
- query.artifactId,
647
- query.versionId,
648
- queryBuilderState.dataSpace.path,
649
- queryBuilderState.executionContext.name,
650
- undefined,
651
- undefined,
652
- ),
653
- );
654
- } else {
655
- const mapping =
656
- editorStore.queryBuilderState?.executionContextState.mapping;
657
- const runtime =
658
- editorStore.queryBuilderState?.executionContextState.runtimeValue;
659
- if (mapping && runtime instanceof RuntimePointer) {
660
- editorStore.applicationStore.navigationService.navigator.goToLocation(
661
- generateMappingQueryCreatorRoute(
662
- query.groupId,
663
- query.artifactId,
664
- query.versionId,
665
- mapping.path,
666
- runtime.packageableRuntime.value.path,
667
- ),
668
- );
669
- }
670
- }
671
- }
672
- }
673
- };
674
-
675
- const toggleAssistant = (): void =>
676
- applicationStore.assistantService.toggleAssistant();
677
-
678
- const queryDocEntry = applicationStore.documentationService.getDocEntry(
679
- QUERY_DOCUMENTATION_KEY.TUTORIAL_QUERY_BUILDER,
680
- );
681
-
682
- const openQueryTutorial = (): void => {
683
- if (queryDocEntry?.url) {
684
- applicationStore.navigationService.navigator.visitAddress(
685
- queryDocEntry.url,
686
- );
687
- }
688
- };
689
-
690
- const handleQuerySaveAs = (): void => {
691
- editorStore.queryCreatorState.open(
692
- editorStore instanceof ExistingQueryEditorStore
693
- ? editorStore.query
694
- : undefined,
695
- );
696
- };
697
-
698
- const renderQueryTitle = (): React.ReactNode => {
699
- if (editorStore instanceof ExistingQueryEditorStore) {
700
- return (
701
- <QueryEditorExistingQueryHeader
702
- queryBuilderState={queryBuilderState}
703
- existingEditorStore={editorStore}
704
- />
705
- );
706
- } else if (editorStore instanceof DataSpaceTemplateQueryCreatorStore) {
707
- return (
708
- <div className="query-editor__dataspace__header">
709
- <div className="query-editor__header__content__main query-editor__header__content__title__text query-editor__dataspace__header__title__text">
710
- {editorStore.templateQueryTitle}
711
- </div>
712
- <div className="query-editor__dataspace__header__title__tag">
713
- template
714
- </div>
715
- </div>
716
- );
717
- }
718
-
719
- return (
720
- <div className="query-editor__header__content__main query-editor__header__content__title" />
721
- );
722
- };
723
-
724
- const extraHelpMenuContentItems = applicationStore.pluginManager
725
- .getApplicationPlugins()
726
- .flatMap(
727
- (plugin) =>
728
- plugin.getExtraQueryEditorHelpMenuActionConfigurations?.() ?? [],
729
- )
730
- .map((item) => (
731
- <MenuContentItem
732
- key={item.key}
733
- title={item.title ?? ''}
734
- onClick={() => item.onClick(editorStore)}
735
- >
736
- {item.icon && <MenuContentItemIcon>{item.icon}</MenuContentItemIcon>}
737
- <MenuContentItemLabel>{item.label}</MenuContentItemLabel>
738
- </MenuContentItem>
739
- ));
740
-
741
- const proceedCuratedTemplateQueryPromotion = async (): Promise<void> => {
742
- if (
743
- !(
744
- editorStore instanceof ExistingQueryEditorStore &&
745
- queryBuilderState instanceof DataSpaceQueryBuilderState
746
- )
747
- ) {
748
- return;
749
- }
750
- // fetch project data
751
- const project = StoreProjectData.serialization.fromJson(
752
- await editorStore.depotServerClient.getProject(
753
- editorStore.lightQuery.groupId,
754
- editorStore.lightQuery.artifactId,
755
- ),
756
- );
757
-
758
- // find the matching SDLC instance
759
- const projectIDPrefix = parseProjectIdentifier(project.projectId).prefix;
760
- const matchingSDLCEntry =
761
- editorStore.applicationStore.config.studioInstances.find(
762
- (entry) => entry.sdlcProjectIDPrefix === projectIDPrefix,
763
- );
764
- if (matchingSDLCEntry) {
765
- editorStore.applicationStore.navigationService.navigator.visitAddress(
766
- buildUrl([
767
- editorStore.applicationStore.config.studioApplicationUrl,
768
- generateDataSpaceTemplateQueryPromotionRoute(
769
- editorStore.lightQuery.groupId,
770
- editorStore.lightQuery.artifactId,
771
- editorStore.lightQuery.versionId,
772
- queryBuilderState.dataSpace.path,
773
- editorStore.lightQuery.id,
774
- ),
775
- ]),
776
- );
777
- } else {
778
- editorStore.applicationStore.notificationService.notifyWarning(
779
- `Can't find the corresponding SDLC instance to productionize the query`,
780
- );
781
- }
782
- };
783
-
784
- const proceedTemplate = (): void => {
785
- queryBuilderState.changeDetectionState.alertUnsavedChanges(() => {
786
- proceedCuratedTemplateQueryPromotion().catch(
787
- editorStore.applicationStore.alertUnhandledError,
788
- );
789
- });
790
- };
791
-
792
- return (
793
- <div
794
- className="query-editor__header__content"
795
- data-testid={QUERY_EDITOR_TEST_ID.QUERY_EDITOR_ACTIONS}
796
- >
797
- {renderQueryTitle()}
798
-
799
- <div className="query-editor__header__actions">
800
- {applicationStore.pluginManager
801
- .getApplicationPlugins()
802
- .flatMap(
803
- (plugin) =>
804
- plugin.getExtraQueryEditorActionConfigurations?.(editorStore) ??
805
- [],
806
- )
807
- .map((actionConfig) => (
808
- <Fragment key={actionConfig.key}>
809
- {actionConfig.renderer(editorStore, queryBuilderState)}
810
- </Fragment>
811
- ))}
812
- <>
813
- {editorStore instanceof ExistingQueryEditorStore &&
814
- queryBuilderState instanceof DataSpaceQueryBuilderState && (
815
- <button
816
- className="query-editor__header__action btn--dark"
817
- tabIndex={-1}
818
- onClick={proceedTemplate}
819
- title={
820
- !(editorStore instanceof ExistingQueryEditorStore)
821
- ? 'Please save your query first before promoting'
822
- : 'Promote Curated Template query...'
823
- }
824
- >
825
- <ArrowCircleUpIcon className="query-editor__header__action__icon--productionize" />
826
- <div className="query-editor__header__action__label">
827
- Promote as Template Query
828
- </div>
829
- </button>
830
- )}
831
- </>
832
- <Button
833
- className="query-editor__header__action btn--dark"
834
- disabled={editorStore.isPerformingBlockingAction}
835
- onClick={openQueryLoader}
836
- title="Load query..."
837
- >
838
- <ManageSearchIcon className="query-editor__header__action__icon--load" />
839
- <div className="query-editor__header__action__label">
840
- Load Query
841
- </div>
842
- </Button>
843
-
844
- {isExistingQuery && (
845
- <Button
846
- className="query-editor__header__action btn--dark"
847
- disabled={editorStore.isPerformingBlockingAction}
848
- onClick={handleNewQuery}
849
- title="New query"
850
- >
851
- <SaveCurrIcon />
852
- <div className="query-editor__header__action__label">
853
- New Query
854
- </div>
855
- </Button>
856
- )}
857
- <Button
858
- className="query-editor__header__action btn--dark"
859
- disabled={
860
- !isExistingQuery || editorStore.isPerformingBlockingAction
861
- }
862
- onClick={openSaveQueryModal}
863
- title="Save query"
864
- >
865
- <SaveCurrIcon />
866
- <div className="query-editor__header__action__label">Save</div>
867
- </Button>
868
- <Button
869
- className="query-editor__header__action btn--dark"
870
- disabled={editorStore.isPerformingBlockingAction}
871
- onClick={handleQuerySaveAs}
872
- title="Save as new query"
873
- >
874
- <SaveAsIcon />
875
- <div className="query-editor__header__action__label">
876
- Save As...
877
- </div>
878
- </Button>
879
- <DropdownMenu
880
- className="query-editor__header__action btn--dark"
881
- disabled={editorStore.isViewProjectActionDisabled}
882
- content={
883
- <MenuContent>
884
- {extraHelpMenuContentItems}
885
- {queryDocEntry && (
886
- <MenuContentItem onClick={openQueryTutorial}>
887
- <MenuContentItemIcon>{null}</MenuContentItemIcon>
888
- <MenuContentItemLabel>
889
- Open Documentation
890
- </MenuContentItemLabel>
891
- </MenuContentItem>
892
- )}
893
-
894
- <MenuContentItem onClick={toggleAssistant}>
895
- <MenuContentItemIcon>
896
- {!applicationStore.assistantService.isHidden ? (
897
- <CheckIcon />
898
- ) : null}
899
- </MenuContentItemIcon>
900
- <MenuContentItemLabel>
901
- Show Virtual Assistant
902
- </MenuContentItemLabel>
903
- </MenuContentItem>
904
- </MenuContent>
905
- }
906
- >
907
- <div
908
- className="query-editor__header__action__label"
909
- title="See more options"
910
- >
911
- Help...
912
- </div>
913
- <CaretDownIcon className="query-editor__header__action__dropdown-trigger" />
914
- </DropdownMenu>
915
- {editorStore.queryLoaderState.isQueryLoaderDialogOpen && (
916
- <QueryLoaderDialog
917
- queryLoaderState={editorStore.queryLoaderState}
918
- title="Load query"
919
- />
920
- )}
921
- <button
922
- title="Toggle light/dark mode"
923
- onClick={TEMPORARY__toggleLightDarkMode}
924
- className="query-editor__header__action query-editor__header__action__theme-toggler"
925
- >
926
- {applicationStore.layoutService
927
- .TEMPORARY__isLightColorThemeEnabled ? (
928
- <>
929
- <LightBulbIcon className="query-editor__header__action__icon--bulb--light" />
930
- </>
931
- ) : (
932
- <>
933
- <EmptyLightBulbIcon className="query-editor__header__action__icon--bulb--dark" />
934
- </>
935
- )}
936
- </button>
937
-
938
- <DropdownMenu
939
- className="query-editor__header__action btn--medium"
940
- disabled={editorStore.isViewProjectActionDisabled}
941
- content={
942
- <MenuContent>
943
- {isExistingQuery && (
944
- <MenuContentItem
945
- className="query-editor__header__action__options"
946
- onClick={renameQuery}
947
- disabled={!isExistingQuery}
948
- >
949
- Rename Query
950
- </MenuContentItem>
951
- )}
952
- {isExistingQuery && (
953
- <MenuContentItem
954
- className="query-editor__header__action__options"
955
- onClick={showQueryInfo}
956
- disabled={!isExistingQuery}
957
- >
958
- Get Query Info
959
- </MenuContentItem>
960
- )}
961
- <MenuContentItem
962
- className="query-editor__header__action__options"
963
- disabled={editorStore.isViewProjectActionDisabled}
964
- onClick={viewProject}
965
- >
966
- Go to Project
967
- </MenuContentItem>
968
- <MenuContentItem
969
- className="query-editor__header__action__options"
970
- disabled={editorStore.isViewProjectActionDisabled}
971
- onClick={viewSDLCProject}
972
- >
973
- Go to SDLC project
974
- </MenuContentItem>
975
- </MenuContent>
976
- }
977
- >
978
- <div
979
- className="query-editor__header__action__label"
980
- title="See more options"
981
- >
982
- More Actions...
983
- </div>
984
- <CaretDownIcon className="query-editor__header__action__dropdown-trigger" />
985
- </DropdownMenu>
986
-
987
- {editorStore.queryCreatorState.showCreateModal && (
988
- <CreateQueryDialog />
989
- )}
990
- {isExistingQuery &&
991
- editorStore.updateState.showQueryInfo &&
992
- editorStore.query && (
993
- <QueryEditorExistingQueryInfoModal
994
- existingEditorStore={editorStore}
995
- query={editorStore.query}
996
- />
997
- )}
998
- </div>
999
- </div>
1000
- );
1001
- },
1002
- );
1003
-
1004
549
  export const QueryEditor = observer(() => {
1005
550
  const applicationStore = useApplicationStore();
1006
551
  const editorStore = useQueryEditorStore();
1007
552
  const isLoadingEditor = !editorStore.initState.hasCompleted;
553
+ const isExistingQuery = editorStore instanceof ExistingQueryEditorStore;
1008
554
 
1009
555
  // documentation
1010
556
  const appDocUrl = applicationStore.documentationService.url;
@@ -1024,6 +570,8 @@ export const QueryEditor = observer(() => {
1024
570
  generateQuerySetupRoute(),
1025
571
  ),
1026
572
  );
573
+ const goToReleaseLog = (): void =>
574
+ applicationStore.releaseNotesService.setReleaseLog(true);
1027
575
  // settings
1028
576
  // NOTE: this is temporary until we find a better home for these settings in query builder
1029
577
  const engineConfig =
@@ -1041,10 +589,10 @@ export const QueryEditor = observer(() => {
1041
589
 
1042
590
  return (
1043
591
  <div className="query-editor">
1044
- <div className="query-editor__header">
1045
- <div className="query-editor__header__menu">
592
+ <div className="query-editor__logo-header">
593
+ <div className="query-editor__logo-header__menu">
1046
594
  <DropdownMenu
1047
- className="query-editor__header__menu-item"
595
+ className="query-editor__logo-header__menu-item"
1048
596
  menuProps={{
1049
597
  anchorOrigin: { vertical: 'top', horizontal: 'right' },
1050
598
  transformOrigin: { vertical: 'top', horizontal: 'left' },
@@ -1055,6 +603,9 @@ export const QueryEditor = observer(() => {
1055
603
  <MenuContentItem onClick={goToQuerySetup}>
1056
604
  Back to query setup
1057
605
  </MenuContentItem>
606
+ <MenuContentItem onClick={goToReleaseLog}>
607
+ Legend Query Release Log
608
+ </MenuContentItem>
1058
609
  <MenuContentItem
1059
610
  disabled={!appDocUrl}
1060
611
  onClick={goToDocumentation}
@@ -1089,11 +640,22 @@ export const QueryEditor = observer(() => {
1089
640
  <MenuIcon />
1090
641
  </DropdownMenu>
1091
642
  </div>
1092
- {!isLoadingEditor && editorStore.queryBuilderState && (
1093
- <QueryEditorHeaderContent
1094
- queryBuilderState={editorStore.queryBuilderState}
643
+ <div className="query-editor__logo-header__name">Legend Query</div>
644
+ {editorStore.queryLoaderState.isQueryLoaderDialogOpen && (
645
+ <QueryLoaderDialog
646
+ queryLoaderState={editorStore.queryLoaderState}
647
+ title="Load query"
1095
648
  />
1096
649
  )}
650
+ {editorStore.queryCreatorState.showCreateModal && <CreateQueryDialog />}
651
+ {isExistingQuery &&
652
+ editorStore.updateState.showQueryInfo &&
653
+ editorStore.query && (
654
+ <QueryEditorExistingQueryInfoModal
655
+ existingEditorStore={editorStore}
656
+ query={editorStore.query}
657
+ />
658
+ )}
1097
659
  </div>
1098
660
  <div className="query-editor__content">
1099
661
  <PanelLoadingIndicator isLoading={isLoadingEditor} />
@@ -43,6 +43,7 @@ import {
43
43
  } from '@finos/legend-query-builder';
44
44
  import { LegendQueryFrameworkProvider } from '../LegendQueryFrameworkProvider.js';
45
45
  import { TEST__BrowserEnvironmentProvider } from '@finos/legend-application/test';
46
+ import { Core_LegendQueryApplicationPlugin } from '../Core_LegendQueryApplicationPlugin.js';
46
47
 
47
48
  const TEST_QUERY_ID = 'test-query-id';
48
49
  export const TEST_QUERY_NAME = 'MyTestQuery';
@@ -55,6 +56,7 @@ export const TEST__provideMockedQueryEditorStore = (customization?: {
55
56
  }): ExistingQueryEditorStore => {
56
57
  const pluginManager =
57
58
  customization?.pluginManager ?? LegendQueryPluginManager.create();
59
+ pluginManager.usePlugins([new Core_LegendQueryApplicationPlugin()]).install();
58
60
  const applicationStore =
59
61
  customization?.applicationStore ??
60
62
  new ApplicationStore(