@finos/legend-application-query 13.4.12 → 13.4.14

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 (64) hide show
  1. package/lib/components/Core_LegendQueryApplicationPlugin.d.ts +5 -0
  2. package/lib/components/Core_LegendQueryApplicationPlugin.d.ts.map +1 -1
  3. package/lib/components/Core_LegendQueryApplicationPlugin.js +201 -4
  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 +25 -140
  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 -2
  18. package/lib/index.d.ts.map +1 -1
  19. package/lib/index.js +1 -2
  20. package/lib/index.js.map +1 -1
  21. package/lib/package.json +1 -1
  22. package/lib/stores/LegendQueryApplicationPlugin.d.ts +4 -12
  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 +7 -1
  27. package/lib/stores/QueryEditorStore.d.ts.map +1 -1
  28. package/lib/stores/QueryEditorStore.js +18 -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 +406 -1
  44. package/src/components/QueryEditor.tsx +111 -507
  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 -2
  48. package/src/stores/{LegendQueryApplicationPlugin.ts → LegendQueryApplicationPlugin.tsx} +11 -18
  49. package/src/stores/QueryEditorStore.ts +23 -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 -4
  55. package/lib/__lib__/LegendQueryTesting.d.ts +0 -19
  56. package/lib/__lib__/LegendQueryTesting.d.ts.map +0 -1
  57. package/lib/__lib__/LegendQueryTesting.js +0 -20
  58. package/lib/__lib__/LegendQueryTesting.js.map +0 -1
  59. package/lib/application/LegendQueryDocumentation.d.ts +0 -19
  60. package/lib/application/LegendQueryDocumentation.d.ts.map +0 -1
  61. package/lib/application/LegendQueryDocumentation.js +0 -20
  62. package/lib/application/LegendQueryDocumentation.js.map +0 -1
  63. package/src/__lib__/LegendQueryTesting.ts +0 -19
  64. package/src/application/LegendQueryDocumentation.ts +0 -19
@@ -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,17 @@ 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,
43
+ PencilIcon,
44
+ MoonIcon,
45
+ SunIcon,
51
46
  } from '@finos/legend-art';
52
47
  import { observer } from 'mobx-react-lite';
53
48
  import { Fragment, useEffect, useMemo, useRef, useState } from 'react';
@@ -59,13 +54,8 @@ import {
59
54
  LEGEND_QUERY_ROUTE_PATTERN_TOKEN,
60
55
  generateQuerySetupRoute,
61
56
  generateExistingQueryEditorRoute,
62
- generateMappingQueryCreatorRoute,
63
57
  } from '../__lib__/LegendQueryNavigation.js';
64
- import {
65
- createViewProjectHandler,
66
- createViewSDLCProjectHandler,
67
- ExistingQueryEditorStore,
68
- } from '../stores/QueryEditorStore.js';
58
+ import { ExistingQueryEditorStore } from '../stores/QueryEditorStore.js';
69
59
  import {
70
60
  LEGEND_APPLICATION_COLOR_THEME,
71
61
  useApplicationStore,
@@ -78,7 +68,6 @@ import {
78
68
  useQueryEditorStore,
79
69
  } from './QueryEditorStoreProvider.js';
80
70
  import { flowResult } from 'mobx';
81
- import { useLegendQueryApplicationStore } from './LegendQueryFrameworkProvider.js';
82
71
  import {
83
72
  QueryBuilder,
84
73
  QueryBuilderNavigationBlocker,
@@ -86,33 +75,20 @@ import {
86
75
  QueryBuilderDiffViewPanel,
87
76
  type QueryBuilderState,
88
77
  } 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';
78
+
93
79
  import {
94
80
  compareSemVerVersions,
95
81
  generateGAVCoordinates,
96
- parseProjectIdentifier,
97
82
  } from '@finos/legend-storage';
98
83
  import {
84
+ type Query,
99
85
  QueryDataSpaceExecutionContext,
100
86
  QueryExplicitExecutionContext,
101
- RuntimePointer,
102
- type Query,
103
87
  } from '@finos/legend-graph';
104
- import {
105
- LATEST_VERSION_ALIAS,
106
- StoreProjectData,
107
- } from '@finos/legend-server-depot';
88
+ import { LATEST_VERSION_ALIAS } from '@finos/legend-server-depot';
108
89
  import { buildVersionOption, type VersionOption } from './QuerySetup.js';
109
90
  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';
91
+ import { debounce } from '@finos/legend-shared';
116
92
 
117
93
  const CreateQueryDialog = observer(() => {
118
94
  const editorStore = useQueryEditorStore();
@@ -281,7 +257,7 @@ const SaveQueryDialog = observer(
281
257
  },
282
258
  );
283
259
 
284
- const QueryEditorExistingQueryHeader = observer(
260
+ export const QueryEditorExistingQueryHeader = observer(
285
261
  (props: {
286
262
  queryBuilderState: QueryBuilderState;
287
263
  existingEditorStore: ExistingQueryEditorStore;
@@ -386,6 +362,12 @@ const QueryEditorExistingQueryHeader = observer(
386
362
  title="Double-click to rename query"
387
363
  >
388
364
  {existingEditorStore.lightQuery.name}
365
+ <button
366
+ className="panel__content__form__section__list__item__edit-btn"
367
+ onClick={enableRename}
368
+ >
369
+ <PencilIcon />
370
+ </button>
389
371
  </div>
390
372
  )}
391
373
  {existingEditorStore.updateState.saveModal && (
@@ -576,435 +558,11 @@ const QueryEditorExistingQueryInfoModal = observer(
576
558
  },
577
559
  );
578
560
 
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
561
  export const QueryEditor = observer(() => {
1005
562
  const applicationStore = useApplicationStore();
1006
563
  const editorStore = useQueryEditorStore();
1007
564
  const isLoadingEditor = !editorStore.initState.hasCompleted;
565
+ const isExistingQuery = editorStore instanceof ExistingQueryEditorStore;
1008
566
 
1009
567
  // documentation
1010
568
  const appDocUrl = applicationStore.documentationService.url;
@@ -1024,6 +582,8 @@ export const QueryEditor = observer(() => {
1024
582
  generateQuerySetupRoute(),
1025
583
  ),
1026
584
  );
585
+ const goToReleaseLog = (): void =>
586
+ applicationStore.releaseNotesService.setReleaseLog(true);
1027
587
  // settings
1028
588
  // NOTE: this is temporary until we find a better home for these settings in query builder
1029
589
  const engineConfig =
@@ -1033,6 +593,15 @@ export const QueryEditor = observer(() => {
1033
593
  !engineConfig.useClientRequestPayloadCompression,
1034
594
  );
1035
595
 
596
+ const TEMPORARY__toggleLightDarkMode = (): void => {
597
+ applicationStore.layoutService.setColorTheme(
598
+ applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
599
+ ? LEGEND_APPLICATION_COLOR_THEME.DEFAULT_DARK
600
+ : LEGEND_APPLICATION_COLOR_THEME.LEGACY_LIGHT,
601
+ { persist: true },
602
+ );
603
+ };
604
+
1036
605
  useEffect(() => {
1037
606
  flowResult(editorStore.initialize()).catch(
1038
607
  applicationStore.alertUnhandledError,
@@ -1041,60 +610,80 @@ export const QueryEditor = observer(() => {
1041
610
 
1042
611
  return (
1043
612
  <div className="query-editor">
1044
- <div className="query-editor__header">
1045
- <div className="query-editor__header__menu">
1046
- <DropdownMenu
1047
- className="query-editor__header__menu-item"
1048
- menuProps={{
1049
- anchorOrigin: { vertical: 'top', horizontal: 'right' },
1050
- transformOrigin: { vertical: 'top', horizontal: 'left' },
1051
- elevation: 7,
1052
- }}
1053
- content={
1054
- <MenuContent>
1055
- <MenuContentItem onClick={goToQuerySetup}>
1056
- Back to query setup
1057
- </MenuContentItem>
1058
- <MenuContentItem
1059
- disabled={!appDocUrl}
1060
- onClick={goToDocumentation}
1061
- >
1062
- Documentation
1063
- </MenuContentItem>
1064
- {docLinks?.map((entry) => (
613
+ <div className="query-editor__logo-header">
614
+ <div className="query-editor__logo-header__combo">
615
+ <div className="query-editor__logo-header__combo__menu">
616
+ <DropdownMenu
617
+ className="query-editor__logo-header__combo__menu-item"
618
+ menuProps={{
619
+ anchorOrigin: { vertical: 'top', horizontal: 'right' },
620
+ transformOrigin: { vertical: 'top', horizontal: 'left' },
621
+ elevation: 7,
622
+ }}
623
+ content={
624
+ <MenuContent>
625
+ <MenuContentItem onClick={goToQuerySetup}>
626
+ Back to query setup
627
+ </MenuContentItem>
628
+ <MenuContentItem onClick={goToReleaseLog}>
629
+ Legend Query Release Log
630
+ </MenuContentItem>
1065
631
  <MenuContentItem
1066
- key={entry.key}
1067
- onClick={(): void => goToDocLink(entry.url)}
632
+ disabled={!appDocUrl}
633
+ onClick={goToDocumentation}
1068
634
  >
1069
- {entry.label}
635
+ Documentation
1070
636
  </MenuContentItem>
1071
- ))}
1072
- <MenuContentDivider />
1073
- <MenuContentItem disabled={true}>Settings</MenuContentItem>
1074
- <MenuContentItem
1075
- onClick={toggleEngineClientRequestPayloadCompression}
1076
- >
1077
- <MenuContentItemIcon>
1078
- {engineConfig.useClientRequestPayloadCompression ? (
1079
- <CheckIcon />
1080
- ) : null}
1081
- </MenuContentItemIcon>
1082
- <MenuContentItemLabel>
1083
- Compress request payload
1084
- </MenuContentItemLabel>
1085
- </MenuContentItem>
1086
- </MenuContent>
1087
- }
1088
- >
1089
- <MenuIcon />
1090
- </DropdownMenu>
637
+ {docLinks?.map((entry) => (
638
+ <MenuContentItem
639
+ key={entry.key}
640
+ onClick={(): void => goToDocLink(entry.url)}
641
+ >
642
+ {entry.label}
643
+ </MenuContentItem>
644
+ ))}
645
+ <MenuContentDivider />
646
+ <MenuContentItem disabled={true}>Settings</MenuContentItem>
647
+ <MenuContentItem
648
+ onClick={toggleEngineClientRequestPayloadCompression}
649
+ >
650
+ <MenuContentItemIcon>
651
+ {engineConfig.useClientRequestPayloadCompression ? (
652
+ <CheckIcon />
653
+ ) : null}
654
+ </MenuContentItemIcon>
655
+ <MenuContentItemLabel>
656
+ Compress request payload
657
+ </MenuContentItemLabel>
658
+ </MenuContentItem>
659
+ </MenuContent>
660
+ }
661
+ >
662
+ <MenuIcon />
663
+ </DropdownMenu>
664
+ </div>
665
+ <div className="query-editor__logo-header__combo__name">
666
+ Legend Query
667
+ </div>
1091
668
  </div>
1092
- {!isLoadingEditor && editorStore.queryBuilderState && (
1093
- <QueryEditorHeaderContent
1094
- queryBuilderState={editorStore.queryBuilderState}
1095
- />
1096
- )}
669
+ <button
670
+ title="Toggle light/dark mode"
671
+ onClick={TEMPORARY__toggleLightDarkMode}
672
+ className="query-editor__header__action query-editor__header__action__theme-toggler"
673
+ >
674
+ {applicationStore.layoutService
675
+ .TEMPORARY__isLightColorThemeEnabled ? (
676
+ <>
677
+ <SunIcon className="query-editor__header__action__icon--bulb--light" />
678
+ </>
679
+ ) : (
680
+ <>
681
+ <MoonIcon className="query-editor__header__action__icon--bulb--dark" />
682
+ </>
683
+ )}
684
+ </button>
1097
685
  </div>
686
+
1098
687
  <div className="query-editor__content">
1099
688
  <PanelLoadingIndicator isLoading={isLoadingEditor} />
1100
689
  {!isLoadingEditor && editorStore.queryBuilderState && (
@@ -1122,6 +711,21 @@ export const QueryEditor = observer(() => {
1122
711
  />
1123
712
  )}
1124
713
  </div>
714
+ {editorStore.queryLoaderState.isQueryLoaderDialogOpen && (
715
+ <QueryLoaderDialog
716
+ queryLoaderState={editorStore.queryLoaderState}
717
+ title="Load query"
718
+ />
719
+ )}
720
+ {editorStore.queryCreatorState.showCreateModal && <CreateQueryDialog />}
721
+ {isExistingQuery &&
722
+ editorStore.updateState.showQueryInfo &&
723
+ editorStore.query && (
724
+ <QueryEditorExistingQueryInfoModal
725
+ existingEditorStore={editorStore}
726
+ query={editorStore.query}
727
+ />
728
+ )}
1125
729
  </div>
1126
730
  );
1127
731
  });