@finos/legend-query-builder 3.0.7 → 3.0.8
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.
- package/lib/__lib__/QueryBuilderDocumentation.d.ts +0 -1
- package/lib/__lib__/QueryBuilderDocumentation.d.ts.map +1 -1
- package/lib/__lib__/QueryBuilderDocumentation.js +0 -1
- package/lib/__lib__/QueryBuilderDocumentation.js.map +1 -1
- package/lib/__lib__/QueryBuilderEvent.d.ts +18 -0
- package/lib/__lib__/QueryBuilderEvent.d.ts.map +1 -1
- package/lib/__lib__/QueryBuilderEvent.js +20 -0
- package/lib/__lib__/QueryBuilderEvent.js.map +1 -1
- package/lib/__lib__/QueryBuilderTelemetryHelper.d.ts +14 -0
- package/lib/__lib__/QueryBuilderTelemetryHelper.d.ts.map +1 -1
- package/lib/__lib__/QueryBuilderTelemetryHelper.js +43 -1
- package/lib/__lib__/QueryBuilderTelemetryHelper.js.map +1 -1
- package/lib/components/QueryBuilder.d.ts +0 -1
- package/lib/components/QueryBuilder.d.ts.map +1 -1
- package/lib/components/QueryBuilder.js +25 -34
- package/lib/components/QueryBuilder.js.map +1 -1
- package/lib/components/QueryBuilderConstantExpressionPanel.d.ts +0 -1
- package/lib/components/QueryBuilderConstantExpressionPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderDiffPanel.d.ts +0 -1
- package/lib/components/QueryBuilderDiffPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderParametersPanel.d.ts +0 -1
- package/lib/components/QueryBuilderParametersPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderPropertyExpressionEditor.d.ts +0 -1
- package/lib/components/QueryBuilderPropertyExpressionEditor.d.ts.map +1 -1
- package/lib/components/QueryBuilderResultPanel.d.ts +0 -1
- package/lib/components/QueryBuilderResultPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderSideBar.d.ts +0 -1
- package/lib/components/QueryBuilderSideBar.d.ts.map +1 -1
- package/lib/components/QueryBuilderTextEditor.d.ts +0 -1
- package/lib/components/QueryBuilderTextEditor.d.ts.map +1 -1
- package/lib/components/QueryBuilderUnsupportedQueryEditor.d.ts +0 -1
- package/lib/components/QueryBuilderUnsupportedQueryEditor.d.ts.map +1 -1
- package/lib/components/explorer/QueryBuilderFunctionsExplorerPanel.d.ts +0 -1
- package/lib/components/explorer/QueryBuilderFunctionsExplorerPanel.d.ts.map +1 -1
- package/lib/components/explorer/QueryBuilderMilestoningEditor.d.ts +0 -1
- package/lib/components/explorer/QueryBuilderMilestoningEditor.d.ts.map +1 -1
- package/lib/components/explorer/QueryBuilderPropertySearchPanel.d.ts +0 -1
- package/lib/components/explorer/QueryBuilderPropertySearchPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.d.ts +0 -1
- package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.d.ts +0 -1
- package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.d.ts +0 -1
- package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js +13 -3
- package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderPostTDSPanel.d.ts +0 -1
- package/lib/components/fetch-structure/QueryBuilderPostTDSPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.d.ts +0 -1
- package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts +0 -1
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.js +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.d.ts +0 -1
- package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js +2 -2
- package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js.map +1 -1
- package/lib/components/filter/QueryBuilderFilterPanel.d.ts +0 -1
- package/lib/components/filter/QueryBuilderFilterPanel.d.ts.map +1 -1
- package/lib/components/filter/QueryBuilderFilterPanel.js +14 -3
- package/lib/components/filter/QueryBuilderFilterPanel.js.map +1 -1
- package/lib/components/shared/LambdaEditor.d.ts +0 -1
- package/lib/components/shared/LambdaEditor.d.ts.map +1 -1
- package/lib/components/shared/LambdaParameterValuesEditor.d.ts +0 -1
- package/lib/components/shared/LambdaParameterValuesEditor.d.ts.map +1 -1
- package/lib/components/shared/LambdaParameterValuesEditor.js +2 -1
- package/lib/components/shared/LambdaParameterValuesEditor.js.map +1 -1
- package/lib/components/shared/QueryBuilderVariableSelector.d.ts +0 -1
- package/lib/components/shared/QueryBuilderVariableSelector.d.ts.map +1 -1
- package/lib/components/watermark/QueryBuilderWatermark.d.ts +0 -1
- package/lib/components/watermark/QueryBuilderWatermark.d.ts.map +1 -1
- package/lib/index.css +2 -2
- package/lib/index.css.map +1 -1
- package/lib/package.json +4 -4
- package/lib/stores/QueryBuilderState.d.ts +1 -2
- package/lib/stores/QueryBuilderState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderState.js +5 -6
- package/lib/stores/QueryBuilderState.js.map +1 -1
- package/package.json +10 -10
- package/src/__lib__/QueryBuilderDocumentation.ts +0 -2
- package/src/__lib__/QueryBuilderEvent.ts +20 -0
- package/src/__lib__/QueryBuilderTelemetryHelper.ts +131 -1
- package/src/components/QueryBuilder.tsx +147 -188
- package/src/components/fetch-structure/QueryBuilderPostFilterPanel.tsx +96 -60
- package/src/components/fetch-structure/QueryBuilderTDSPanel.tsx +1 -3
- package/src/components/fetch-structure/QueryBuilderTDSWindowPanel.tsx +2 -4
- package/src/components/filter/QueryBuilderFilterPanel.tsx +102 -60
- package/src/components/shared/LambdaParameterValuesEditor.tsx +2 -1
- package/src/stores/QueryBuilderState.ts +4 -9
|
@@ -43,6 +43,9 @@ import {
|
|
|
43
43
|
PanelEntryDropZonePlaceholder,
|
|
44
44
|
useDragPreviewLayer,
|
|
45
45
|
PanelContent,
|
|
46
|
+
MoreVerticalIcon,
|
|
47
|
+
MenuContentItemIcon,
|
|
48
|
+
MenuContentItemLabel,
|
|
46
49
|
} from '@finos/legend-art';
|
|
47
50
|
import {
|
|
48
51
|
type QueryBuilderFilterConditionDragSource,
|
|
@@ -84,6 +87,7 @@ import {
|
|
|
84
87
|
type QueryBuilderVariableDragSource,
|
|
85
88
|
QUERY_BUILDER_VARIABLE_DND_TYPE,
|
|
86
89
|
} from '../shared/BasicValueSpecificationEditor.js';
|
|
90
|
+
import { QueryBuilderTelemetryHelper } from '../../__lib__/QueryBuilderTelemetryHelper.js';
|
|
87
91
|
|
|
88
92
|
const QueryBuilderFilterGroupConditionEditor = observer(
|
|
89
93
|
(props: {
|
|
@@ -335,6 +339,10 @@ const QueryBuilderFilterConditionContextMenu = observer(
|
|
|
335
339
|
filterState.addGroupConditionNodeFromNode(node);
|
|
336
340
|
};
|
|
337
341
|
const newGroupWithCondition = (): void => {
|
|
342
|
+
QueryBuilderTelemetryHelper.logEvent_FilterCreateGroupFromConditionLaunched(
|
|
343
|
+
queryBuilderState.applicationStore.telemetryService,
|
|
344
|
+
);
|
|
345
|
+
|
|
338
346
|
filterState.suppressClickawayEventListener();
|
|
339
347
|
filterState.newGroupWithConditionFromNode(undefined, node);
|
|
340
348
|
};
|
|
@@ -677,26 +685,42 @@ const QueryBuilderFilterTree = observer(
|
|
|
677
685
|
export const QueryBuilderFilterPanel = observer(
|
|
678
686
|
(props: { queryBuilderState: QueryBuilderState }) => {
|
|
679
687
|
const { queryBuilderState } = props;
|
|
688
|
+
|
|
680
689
|
const applicationStore = useApplicationStore();
|
|
681
690
|
const filterState = queryBuilderState.filterState;
|
|
682
691
|
const rootNode = filterState.getRootNode();
|
|
683
692
|
const collapseTree = (): void => {
|
|
693
|
+
QueryBuilderTelemetryHelper.logEvent_FilterCollapseTreeLaunched(
|
|
694
|
+
queryBuilderState.applicationStore.telemetryService,
|
|
695
|
+
);
|
|
684
696
|
filterState.setSelectedNode(undefined);
|
|
685
697
|
filterState.collapseTree();
|
|
686
698
|
};
|
|
687
699
|
const expandTree = (): void => {
|
|
700
|
+
QueryBuilderTelemetryHelper.logEvent_FilterExpandTreeLaunched(
|
|
701
|
+
queryBuilderState.applicationStore.telemetryService,
|
|
702
|
+
);
|
|
688
703
|
filterState.setSelectedNode(undefined);
|
|
689
704
|
filterState.expandTree();
|
|
690
705
|
};
|
|
691
706
|
const pruneTree = (): void => {
|
|
707
|
+
QueryBuilderTelemetryHelper.logEvent_FilterCleanupTreeLaunched(
|
|
708
|
+
queryBuilderState.applicationStore.telemetryService,
|
|
709
|
+
);
|
|
692
710
|
filterState.suppressClickawayEventListener();
|
|
693
711
|
filterState.pruneTree();
|
|
694
712
|
};
|
|
695
713
|
const simplifyTree = (): void => {
|
|
714
|
+
QueryBuilderTelemetryHelper.logEvent_FilterSimplifyTreeLaunched(
|
|
715
|
+
queryBuilderState.applicationStore.telemetryService,
|
|
716
|
+
);
|
|
696
717
|
filterState.suppressClickawayEventListener();
|
|
697
718
|
filterState.simplifyTree();
|
|
698
719
|
};
|
|
699
720
|
const createCondition = (): void => {
|
|
721
|
+
QueryBuilderTelemetryHelper.logEvent_FilterCreateConditionLaunched(
|
|
722
|
+
queryBuilderState.applicationStore.telemetryService,
|
|
723
|
+
);
|
|
700
724
|
filterState.suppressClickawayEventListener();
|
|
701
725
|
filterState.addNodeFromNode(
|
|
702
726
|
new QueryBuilderFilterTreeBlankConditionNodeData(undefined),
|
|
@@ -709,12 +733,18 @@ export const QueryBuilderFilterPanel = observer(
|
|
|
709
733
|
(filterState.selectedNode !== rootNode || // either not a root node
|
|
710
734
|
rootNode instanceof QueryBuilderFilterTreeGroupNodeData)); // or if it is the root note, it has to be a group node
|
|
711
735
|
const createGroupCondition = (): void => {
|
|
736
|
+
QueryBuilderTelemetryHelper.logEvent_FilterCreateLogicalGroupLaunched(
|
|
737
|
+
queryBuilderState.applicationStore.telemetryService,
|
|
738
|
+
);
|
|
712
739
|
filterState.suppressClickawayEventListener();
|
|
713
740
|
if (allowGroupCreation) {
|
|
714
741
|
filterState.addGroupConditionNodeFromNode(filterState.selectedNode);
|
|
715
742
|
}
|
|
716
743
|
};
|
|
717
744
|
const newGroupWithCondition = (): void => {
|
|
745
|
+
QueryBuilderTelemetryHelper.logEvent_FilterCreateLogicalGroupLaunched(
|
|
746
|
+
applicationStore.telemetryService,
|
|
747
|
+
);
|
|
718
748
|
filterState.suppressClickawayEventListener();
|
|
719
749
|
if (
|
|
720
750
|
filterState.selectedNode instanceof
|
|
@@ -812,70 +842,82 @@ export const QueryBuilderFilterPanel = observer(
|
|
|
812
842
|
<div className="panel__header__title">
|
|
813
843
|
<div className="panel__header__title__label">filter</div>
|
|
814
844
|
</div>
|
|
845
|
+
|
|
815
846
|
<div className="panel__header__actions">
|
|
816
|
-
<
|
|
817
|
-
className="panel__header__action"
|
|
818
|
-
onClick={createCondition}
|
|
819
|
-
tabIndex={-1}
|
|
820
|
-
title="Create Condition"
|
|
821
|
-
>
|
|
822
|
-
<PlusIcon />
|
|
823
|
-
</button>
|
|
824
|
-
<button
|
|
847
|
+
<DropdownMenu
|
|
825
848
|
className="panel__header__action"
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
849
|
+
title="Show Filter Options Menu..."
|
|
850
|
+
content={
|
|
851
|
+
<MenuContent>
|
|
852
|
+
<MenuContentItem onClick={createCondition}>
|
|
853
|
+
<MenuContentItemIcon>
|
|
854
|
+
<PlusIcon />
|
|
855
|
+
</MenuContentItemIcon>
|
|
856
|
+
<MenuContentItemLabel>
|
|
857
|
+
Create Condition
|
|
858
|
+
</MenuContentItemLabel>
|
|
859
|
+
</MenuContentItem>
|
|
860
|
+
<MenuContentItem
|
|
861
|
+
disabled={
|
|
862
|
+
!(
|
|
863
|
+
filterState.selectedNode instanceof
|
|
864
|
+
QueryBuilderFilterTreeConditionNodeData
|
|
865
|
+
)
|
|
866
|
+
}
|
|
867
|
+
onClick={newGroupWithCondition}
|
|
868
|
+
>
|
|
869
|
+
<MenuContentItemIcon>
|
|
870
|
+
<PlusCircleIcon />
|
|
871
|
+
</MenuContentItemIcon>
|
|
872
|
+
<MenuContentItemLabel>
|
|
873
|
+
Create Group From Condition
|
|
874
|
+
</MenuContentItemLabel>
|
|
875
|
+
</MenuContentItem>
|
|
876
|
+
<MenuContentItem
|
|
877
|
+
disabled={!allowGroupCreation}
|
|
878
|
+
title={
|
|
879
|
+
!allowGroupCreation
|
|
880
|
+
? 'Please select a filter node first to create logical group'
|
|
881
|
+
: ''
|
|
882
|
+
}
|
|
883
|
+
onClick={createGroupCondition}
|
|
884
|
+
>
|
|
885
|
+
<MenuContentItemIcon>
|
|
886
|
+
<NewFolderIcon />
|
|
887
|
+
</MenuContentItemIcon>
|
|
888
|
+
<MenuContentItemLabel>
|
|
889
|
+
Create Logical Group
|
|
890
|
+
</MenuContentItemLabel>
|
|
891
|
+
</MenuContentItem>
|
|
892
|
+
<MenuContentItem onClick={pruneTree}>
|
|
893
|
+
<MenuContentItemIcon>
|
|
894
|
+
<TrashIcon />
|
|
895
|
+
</MenuContentItemIcon>
|
|
896
|
+
<MenuContentItemLabel>Cleanup Tree</MenuContentItemLabel>
|
|
897
|
+
</MenuContentItem>
|
|
898
|
+
<MenuContentItem onClick={simplifyTree}>
|
|
899
|
+
<MenuContentItemIcon>
|
|
900
|
+
<CircleIcon />
|
|
901
|
+
</MenuContentItemIcon>
|
|
902
|
+
<MenuContentItemLabel>Simplify Tree</MenuContentItemLabel>
|
|
903
|
+
</MenuContentItem>
|
|
904
|
+
<MenuContentItem onClick={collapseTree}>
|
|
905
|
+
<MenuContentItemIcon>
|
|
906
|
+
<CompressIcon />
|
|
907
|
+
</MenuContentItemIcon>
|
|
908
|
+
<MenuContentItemLabel>Collapse Tree</MenuContentItemLabel>
|
|
909
|
+
</MenuContentItem>
|
|
910
|
+
<MenuContentItem onClick={expandTree}>
|
|
911
|
+
<MenuContentItemIcon>
|
|
912
|
+
<ExpandIcon />
|
|
913
|
+
</MenuContentItemIcon>
|
|
914
|
+
<MenuContentItemLabel>Expand Tree</MenuContentItemLabel>
|
|
915
|
+
</MenuContentItem>
|
|
916
|
+
</MenuContent>
|
|
831
917
|
}
|
|
832
|
-
onClick={newGroupWithCondition}
|
|
833
|
-
tabIndex={-1}
|
|
834
|
-
title="Create Group From Condition"
|
|
835
918
|
>
|
|
836
|
-
<
|
|
837
|
-
</
|
|
838
|
-
<button
|
|
839
|
-
className="panel__header__action"
|
|
840
|
-
disabled={!allowGroupCreation}
|
|
841
|
-
onClick={createGroupCondition}
|
|
842
|
-
tabIndex={-1}
|
|
843
|
-
title="Create Logical Group"
|
|
844
|
-
>
|
|
845
|
-
<NewFolderIcon />
|
|
846
|
-
</button>
|
|
847
|
-
<button
|
|
848
|
-
className="panel__header__action"
|
|
849
|
-
onClick={pruneTree}
|
|
850
|
-
tabIndex={-1}
|
|
851
|
-
title="Cleanup Tree"
|
|
852
|
-
>
|
|
853
|
-
<TrashIcon />
|
|
854
|
-
</button>
|
|
855
|
-
<button
|
|
856
|
-
className="panel__header__action"
|
|
857
|
-
onClick={simplifyTree}
|
|
858
|
-
tabIndex={-1}
|
|
859
|
-
title="Simplify Tree"
|
|
860
|
-
>
|
|
861
|
-
<CircleIcon />
|
|
862
|
-
</button>
|
|
863
|
-
<button
|
|
864
|
-
className="panel__header__action"
|
|
865
|
-
onClick={collapseTree}
|
|
866
|
-
tabIndex={-1}
|
|
867
|
-
title="Collapse Tree"
|
|
868
|
-
>
|
|
869
|
-
<CompressIcon />
|
|
870
|
-
</button>
|
|
871
|
-
<button
|
|
872
|
-
className="panel__header__action"
|
|
873
|
-
onClick={expandTree}
|
|
874
|
-
tabIndex={-1}
|
|
875
|
-
title="Expand Tree"
|
|
876
|
-
>
|
|
877
|
-
<ExpandIcon />
|
|
878
|
-
</button>
|
|
919
|
+
<MoreVerticalIcon className="query-builder__icon__more-options" />
|
|
920
|
+
</DropdownMenu>
|
|
879
921
|
</div>
|
|
880
922
|
</div>
|
|
881
923
|
<PanelContent>
|
|
@@ -30,6 +30,7 @@ import {
|
|
|
30
30
|
type ObserverContext,
|
|
31
31
|
PrimitiveType,
|
|
32
32
|
} from '@finos/legend-graph';
|
|
33
|
+
import { prettyCONSTName } from '@finos/legend-shared';
|
|
33
34
|
import { observer } from 'mobx-react-lite';
|
|
34
35
|
import { useState } from 'react';
|
|
35
36
|
import type { LambdaParametersState } from '../../stores/shared/LambdaParameterState.js';
|
|
@@ -123,7 +124,7 @@ export const LambdaParameterValuesEditor = observer(
|
|
|
123
124
|
isSubmitAction ? `${submitAction.label}...` : undefined
|
|
124
125
|
}
|
|
125
126
|
onClick={submit}
|
|
126
|
-
text={submitAction.label}
|
|
127
|
+
text={prettyCONSTName(submitAction.label)}
|
|
127
128
|
/>
|
|
128
129
|
)}
|
|
129
130
|
<ModalFooterButton
|
|
@@ -87,6 +87,7 @@ export abstract class QueryBuilderState implements CommandRegistrar {
|
|
|
87
87
|
readonly changeDetectionState: QueryBuilderChangeDetectionState;
|
|
88
88
|
readonly queryCompileState = ActionState.create();
|
|
89
89
|
readonly observerContext: ObserverContext;
|
|
90
|
+
readonly saveQueryProgressState = ActionState.create();
|
|
90
91
|
|
|
91
92
|
explorerState: QueryBuilderExplorerState;
|
|
92
93
|
functionsExplorerState: QueryFunctionsExplorerState;
|
|
@@ -102,8 +103,6 @@ export abstract class QueryBuilderState implements CommandRegistrar {
|
|
|
102
103
|
resultState: QueryBuilderResultState;
|
|
103
104
|
textEditorState: QueryBuilderTextEditorState;
|
|
104
105
|
unsupportedQueryState: QueryBuilderUnsupportedQueryState;
|
|
105
|
-
|
|
106
|
-
titleOfQuery: string | undefined;
|
|
107
106
|
showFunctionsExplorerPanel = false;
|
|
108
107
|
showParametersPanel = false;
|
|
109
108
|
isEditingWatermark = false;
|
|
@@ -129,7 +128,6 @@ export abstract class QueryBuilderState implements CommandRegistrar {
|
|
|
129
128
|
fetchStructureState: observable,
|
|
130
129
|
filterState: observable,
|
|
131
130
|
watermarkState: observable,
|
|
132
|
-
titleOfQuery: observable,
|
|
133
131
|
checkEntitlementsState: observable,
|
|
134
132
|
resultState: observable,
|
|
135
133
|
textEditorState: observable,
|
|
@@ -155,8 +153,6 @@ export abstract class QueryBuilderState implements CommandRegistrar {
|
|
|
155
153
|
setMapping: action,
|
|
156
154
|
setRuntimeValue: action,
|
|
157
155
|
|
|
158
|
-
setTitleOfQuery: action,
|
|
159
|
-
|
|
160
156
|
resetQueryResult: action,
|
|
161
157
|
resetQueryContent: action,
|
|
162
158
|
changeClass: action,
|
|
@@ -259,10 +255,6 @@ export abstract class QueryBuilderState implements CommandRegistrar {
|
|
|
259
255
|
this.runtimeValue = val;
|
|
260
256
|
}
|
|
261
257
|
|
|
262
|
-
setTitleOfQuery(val: string | undefined): void {
|
|
263
|
-
this.titleOfQuery = val;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
258
|
get isQuerySupported(): boolean {
|
|
267
259
|
return !this.unsupportedQueryState.rawLambda;
|
|
268
260
|
}
|
|
@@ -455,6 +447,7 @@ export abstract class QueryBuilderState implements CommandRegistrar {
|
|
|
455
447
|
async saveQuery(
|
|
456
448
|
onSaveQuery: (lambda: RawLambda) => Promise<void>,
|
|
457
449
|
): Promise<void> {
|
|
450
|
+
this.saveQueryProgressState.inProgress();
|
|
458
451
|
try {
|
|
459
452
|
const query = this.buildQuery();
|
|
460
453
|
await onSaveQuery(query);
|
|
@@ -463,6 +456,8 @@ export abstract class QueryBuilderState implements CommandRegistrar {
|
|
|
463
456
|
this.applicationStore.notificationService.notifyError(
|
|
464
457
|
`Can't save query: ${error.message}`,
|
|
465
458
|
);
|
|
459
|
+
} finally {
|
|
460
|
+
this.saveQueryProgressState.complete();
|
|
466
461
|
}
|
|
467
462
|
}
|
|
468
463
|
|