@finos/legend-application-query 5.0.2 → 5.2.2
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/application/LegendQueryApplicationConfig.d.ts +19 -1
- package/lib/application/LegendQueryApplicationConfig.d.ts.map +1 -1
- package/lib/application/LegendQueryApplicationConfig.js +25 -1
- package/lib/application/LegendQueryApplicationConfig.js.map +1 -1
- package/lib/components/LegendQueryApplication.d.ts.map +1 -1
- package/lib/components/LegendQueryApplication.js +15 -5
- package/lib/components/LegendQueryApplication.js.map +1 -1
- package/lib/components/LegendQueryBaseStoreProvider.d.ts.map +1 -1
- package/lib/components/LegendQueryBaseStoreProvider.js +3 -1
- package/lib/components/LegendQueryBaseStoreProvider.js.map +1 -1
- package/lib/components/QueryBuilder.d.ts.map +1 -1
- package/lib/components/QueryBuilder.js +3 -1
- package/lib/components/QueryBuilder.js.map +1 -1
- package/lib/components/QueryBuilderExplorerPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderExplorerPanel.js +7 -34
- package/lib/components/QueryBuilderExplorerPanel.js.map +1 -1
- package/lib/components/QueryBuilderFetchStructurePanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderFetchStructurePanel.js +77 -66
- package/lib/components/QueryBuilderFetchStructurePanel.js.map +1 -1
- package/lib/components/QueryBuilderFilterPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderFilterPanel.js +42 -59
- package/lib/components/QueryBuilderFilterPanel.js.map +1 -1
- package/lib/components/QueryBuilderFunctionsExplorerPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderFunctionsExplorerPanel.js +9 -39
- package/lib/components/QueryBuilderFunctionsExplorerPanel.js.map +1 -1
- package/lib/components/QueryBuilderGraphFetchTreePanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderGraphFetchTreePanel.js +5 -5
- package/lib/components/QueryBuilderGraphFetchTreePanel.js.map +1 -1
- package/lib/components/QueryBuilderLambdaEditor.d.ts +1 -0
- package/lib/components/QueryBuilderLambdaEditor.d.ts.map +1 -1
- package/lib/components/QueryBuilderLambdaEditor.js +2 -2
- package/lib/components/QueryBuilderLambdaEditor.js.map +1 -1
- package/lib/components/QueryBuilderMilestoneEditor.js +5 -5
- package/lib/components/QueryBuilderMilestoneEditor.js.map +1 -1
- package/lib/components/QueryBuilderPanelIssueCountBadge.d.ts +20 -0
- package/lib/components/QueryBuilderPanelIssueCountBadge.d.ts.map +1 -0
- package/lib/components/QueryBuilderPanelIssueCountBadge.js +28 -0
- package/lib/components/QueryBuilderPanelIssueCountBadge.js.map +1 -0
- package/lib/components/QueryBuilderParameterPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderParameterPanel.js +13 -33
- package/lib/components/QueryBuilderParameterPanel.js.map +1 -1
- package/lib/components/QueryBuilderPostFilterPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderPostFilterPanel.js +47 -59
- package/lib/components/QueryBuilderPostFilterPanel.js.map +1 -1
- package/lib/components/QueryBuilderProjectionPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderProjectionPanel.js +47 -63
- package/lib/components/QueryBuilderProjectionPanel.js.map +1 -1
- package/lib/components/QueryBuilderPropertyExpressionEditor.d.ts.map +1 -1
- package/lib/components/QueryBuilderPropertyExpressionEditor.js +11 -11
- package/lib/components/QueryBuilderPropertyExpressionEditor.js.map +1 -1
- package/lib/components/QueryBuilderPropertySearchPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderPropertySearchPanel.js +3 -6
- package/lib/components/QueryBuilderPropertySearchPanel.js.map +1 -1
- package/lib/components/QueryBuilderResultModifierPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderResultModifierPanel.js +3 -1
- package/lib/components/QueryBuilderResultModifierPanel.js.map +1 -1
- package/lib/components/QueryBuilderResultPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderResultPanel.js +28 -18
- package/lib/components/QueryBuilderResultPanel.js.map +1 -1
- package/lib/components/QueryBuilderSetupPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderSetupPanel.js +10 -9
- package/lib/components/QueryBuilderSetupPanel.js.map +1 -1
- package/lib/components/QueryBuilderUnsupportedQueryEditor.d.ts.map +1 -1
- package/lib/components/QueryBuilderUnsupportedQueryEditor.js +4 -2
- package/lib/components/QueryBuilderUnsupportedQueryEditor.js.map +1 -1
- package/lib/components/QueryEditor.d.ts.map +1 -1
- package/lib/components/QueryEditor.js +16 -4
- package/lib/components/QueryEditor.js.map +1 -1
- package/lib/components/QueryEditorComponentTestUtils.d.ts +2 -0
- package/lib/components/QueryEditorComponentTestUtils.d.ts.map +1 -1
- package/lib/components/QueryEditorComponentTestUtils.js +3 -2
- package/lib/components/QueryEditorComponentTestUtils.js.map +1 -1
- package/lib/components/QueryEditorStoreProvider.d.ts.map +1 -1
- package/lib/components/QueryEditorStoreProvider.js +7 -3
- package/lib/components/QueryEditorStoreProvider.js.map +1 -1
- package/lib/components/QuerySetupStoreProvider.d.ts.map +1 -1
- package/lib/components/QuerySetupStoreProvider.js +3 -1
- package/lib/components/QuerySetupStoreProvider.js.map +1 -1
- package/lib/index.css +2 -2
- package/lib/index.css.map +1 -1
- package/lib/package.json +11 -9
- package/lib/stores/LegendQueryBaseStore.d.ts +4 -2
- package/lib/stores/LegendQueryBaseStore.d.ts.map +1 -1
- package/lib/stores/LegendQueryBaseStore.js +5 -1
- package/lib/stores/LegendQueryBaseStore.js.map +1 -1
- package/lib/stores/QueryBuilderExplorerState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderExplorerState.js +5 -0
- package/lib/stores/QueryBuilderExplorerState.js.map +1 -1
- package/lib/stores/QueryBuilderFetchStructureState.d.ts +8 -1
- package/lib/stores/QueryBuilderFetchStructureState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderFetchStructureState.js +10 -2
- package/lib/stores/QueryBuilderFetchStructureState.js.map +1 -1
- package/lib/stores/QueryBuilderFilterState.d.ts +8 -9
- package/lib/stores/QueryBuilderFilterState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderFilterState.js +34 -13
- package/lib/stores/QueryBuilderFilterState.js.map +1 -1
- package/lib/stores/QueryBuilderGraphFetchTreeState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderGraphFetchTreeState.js +6 -3
- package/lib/stores/QueryBuilderGraphFetchTreeState.js.map +1 -1
- package/lib/stores/QueryBuilderLambdaProcessor.d.ts.map +1 -1
- package/lib/stores/QueryBuilderLambdaProcessor.js +2 -0
- package/lib/stores/QueryBuilderLambdaProcessor.js.map +1 -1
- package/lib/stores/QueryBuilderOperatorLoader.d.ts +47 -0
- package/lib/stores/QueryBuilderOperatorLoader.d.ts.map +1 -0
- package/lib/stores/QueryBuilderOperatorLoader.js +94 -0
- package/lib/stores/QueryBuilderOperatorLoader.js.map +1 -0
- package/lib/stores/QueryBuilderPostFilterState.d.ts +9 -6
- package/lib/stores/QueryBuilderPostFilterState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderPostFilterState.js +31 -7
- package/lib/stores/QueryBuilderPostFilterState.js.map +1 -1
- package/lib/stores/QueryBuilderPreviewDataHelper.d.ts +4 -3
- package/lib/stores/QueryBuilderPreviewDataHelper.d.ts.map +1 -1
- package/lib/stores/QueryBuilderPreviewDataHelper.js +77 -97
- package/lib/stores/QueryBuilderPreviewDataHelper.js.map +1 -1
- package/lib/stores/QueryBuilderProjectionState.d.ts +4 -8
- package/lib/stores/QueryBuilderProjectionState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderProjectionState.js +17 -44
- package/lib/stores/QueryBuilderProjectionState.js.map +1 -1
- package/lib/stores/QueryBuilderSetupState.js +1 -1
- package/lib/stores/QueryBuilderSetupState.js.map +1 -1
- package/lib/stores/QueryBuilderState.d.ts +7 -1
- package/lib/stores/QueryBuilderState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderState.js +17 -60
- package/lib/stores/QueryBuilderState.js.map +1 -1
- package/lib/stores/QueryBuilderTestUtils.d.ts +24 -0
- package/lib/stores/QueryBuilderTestUtils.d.ts.map +1 -0
- package/lib/stores/QueryBuilderTestUtils.js +49 -0
- package/lib/stores/QueryBuilderTestUtils.js.map +1 -0
- package/lib/stores/QueryBuilderTypeaheadHelper.d.ts +24 -0
- package/lib/stores/QueryBuilderTypeaheadHelper.d.ts.map +1 -0
- package/lib/stores/QueryBuilderTypeaheadHelper.js +89 -0
- package/lib/stores/QueryBuilderTypeaheadHelper.js.map +1 -0
- package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.d.ts.map +1 -1
- package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.js +7 -7
- package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.js.map +1 -1
- package/lib/stores/QueryEditorStore.d.ts +6 -4
- package/lib/stores/QueryEditorStore.d.ts.map +1 -1
- package/lib/stores/QueryEditorStore.js +23 -10
- package/lib/stores/QueryEditorStore.js.map +1 -1
- package/lib/stores/QueryEditorStoreTestUtils.d.ts.map +1 -1
- package/lib/stores/QueryEditorStoreTestUtils.js +1 -0
- package/lib/stores/QueryEditorStoreTestUtils.js.map +1 -1
- package/lib/stores/QueryFunctionsExplorerState.d.ts +2 -6
- package/lib/stores/QueryFunctionsExplorerState.d.ts.map +1 -1
- package/lib/stores/QueryFunctionsExplorerState.js +2 -11
- package/lib/stores/QueryFunctionsExplorerState.js.map +1 -1
- package/lib/stores/QueryParametersState.d.ts +1 -3
- package/lib/stores/QueryParametersState.d.ts.map +1 -1
- package/lib/stores/QueryParametersState.js +1 -4
- package/lib/stores/QueryParametersState.js.map +1 -1
- package/lib/stores/QuerySetupStore.d.ts +3 -1
- package/lib/stores/QuerySetupStore.d.ts.map +1 -1
- package/lib/stores/QuerySetupStore.js +3 -1
- package/lib/stores/QuerySetupStore.js.map +1 -1
- package/lib/stores/filterOperators/QueryBuilderFilterOperator_Equal.d.ts.map +1 -1
- package/lib/stores/filterOperators/QueryBuilderFilterOperator_Equal.js +4 -1
- package/lib/stores/filterOperators/QueryBuilderFilterOperator_Equal.js.map +1 -1
- package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.d.ts.map +1 -1
- package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.js +4 -1
- package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.js.map +1 -1
- package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.d.ts.map +1 -1
- package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.js +4 -1
- package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.js.map +1 -1
- package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThan.d.ts.map +1 -1
- package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThan.js +4 -1
- package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThan.js.map +1 -1
- package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.d.ts.map +1 -1
- package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.js +4 -1
- package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.js.map +1 -1
- package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.d.ts.map +1 -1
- package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.js +4 -1
- package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.js.map +1 -1
- package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.d.ts.map +1 -1
- package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.js +4 -1
- package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.js.map +1 -1
- package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.d.ts.map +1 -1
- package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.js +4 -1
- package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.js.map +1 -1
- package/package.json +18 -16
- package/src/application/LegendQueryApplicationConfig.ts +41 -2
- package/src/components/LegendQueryApplication.tsx +27 -10
- package/src/components/LegendQueryBaseStoreProvider.tsx +3 -0
- package/src/components/QueryBuilder.tsx +13 -2
- package/src/components/QueryBuilderExplorerPanel.tsx +17 -56
- package/src/components/QueryBuilderFetchStructurePanel.tsx +93 -77
- package/src/components/QueryBuilderFilterPanel.tsx +205 -219
- package/src/components/QueryBuilderFunctionsExplorerPanel.tsx +24 -68
- package/src/components/QueryBuilderGraphFetchTreePanel.tsx +34 -25
- package/src/components/QueryBuilderLambdaEditor.tsx +3 -0
- package/src/components/QueryBuilderMilestoneEditor.tsx +34 -34
- package/src/components/QueryBuilderPanelIssueCountBadge.tsx +38 -0
- package/src/components/QueryBuilderParameterPanel.tsx +23 -55
- package/src/components/QueryBuilderPostFilterPanel.tsx +223 -230
- package/src/components/QueryBuilderProjectionPanel.tsx +127 -154
- package/src/components/QueryBuilderPropertyExpressionEditor.tsx +61 -57
- package/src/components/QueryBuilderPropertySearchPanel.tsx +8 -9
- package/src/components/QueryBuilderResultModifierPanel.tsx +4 -2
- package/src/components/QueryBuilderResultPanel.tsx +75 -50
- package/src/components/QueryBuilderSetupPanel.tsx +13 -12
- package/src/components/QueryBuilderUnsupportedQueryEditor.tsx +4 -2
- package/src/components/QueryEditor.tsx +39 -1
- package/src/components/QueryEditorComponentTestUtils.tsx +15 -5
- package/src/components/QueryEditorStoreProvider.tsx +7 -0
- package/src/components/QuerySetupStoreProvider.tsx +3 -0
- package/src/stores/LegendQueryBaseStore.ts +14 -1
- package/src/stores/QueryBuilderExplorerState.ts +5 -0
- package/src/stores/QueryBuilderFetchStructureState.ts +18 -2
- package/src/stores/QueryBuilderFilterState.ts +50 -12
- package/src/stores/QueryBuilderGraphFetchTreeState.ts +14 -8
- package/src/stores/QueryBuilderLambdaProcessor.ts +8 -0
- package/src/stores/QueryBuilderOperatorLoader.ts +133 -0
- package/src/stores/QueryBuilderPostFilterState.ts +47 -8
- package/src/stores/QueryBuilderPreviewDataHelper.ts +122 -217
- package/src/stores/QueryBuilderProjectionState.ts +30 -58
- package/src/stores/QueryBuilderSetupState.ts +1 -1
- package/src/stores/QueryBuilderState.ts +33 -96
- package/src/stores/QueryBuilderTestUtils.ts +93 -0
- package/src/stores/QueryBuilderTypeaheadHelper.ts +149 -0
- package/src/stores/QueryBuilderValueSpecificationBuilderHelper.ts +9 -7
- package/src/stores/QueryEditorStore.ts +29 -6
- package/src/stores/QueryEditorStoreTestUtils.ts +1 -0
- package/src/stores/QueryFunctionsExplorerState.ts +1 -11
- package/src/stores/QueryParametersState.ts +1 -3
- package/src/stores/QuerySetupStore.ts +4 -0
- package/src/stores/filterOperators/QueryBuilderFilterOperator_Equal.ts +8 -1
- package/src/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.ts +8 -1
- package/src/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.ts +8 -1
- package/src/stores/filterOperators/QueryBuilderFilterOperator_LessThan.ts +8 -1
- package/src/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.ts +8 -1
- package/src/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.ts +8 -1
- package/src/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.ts +8 -1
- package/src/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.ts +8 -1
- package/tsconfig.json +4 -0
@@ -14,6 +14,7 @@
|
|
14
14
|
* limitations under the License.
|
15
15
|
*/
|
16
16
|
|
17
|
+
import { useRef, useState } from 'react';
|
17
18
|
import {
|
18
19
|
clsx,
|
19
20
|
CheckSquareIcon,
|
@@ -28,6 +29,7 @@ import {
|
|
28
29
|
SearchIcon,
|
29
30
|
ChevronDownIcon,
|
30
31
|
ChevronRightIcon,
|
32
|
+
useDragPreviewLayer,
|
31
33
|
} from '@finos/legend-art';
|
32
34
|
import {
|
33
35
|
Class,
|
@@ -37,9 +39,7 @@ import {
|
|
37
39
|
} from '@finos/legend-graph';
|
38
40
|
import { guaranteeNonNullable } from '@finos/legend-shared';
|
39
41
|
import { observer } from 'mobx-react-lite';
|
40
|
-
import { useEffect, useRef, useState } from 'react';
|
41
42
|
import { useDrag } from 'react-dnd';
|
42
|
-
import { getEmptyImage } from 'react-dnd-html5-backend';
|
43
43
|
import { QUERY_BUILDER_PROPERTY_SEARCH_TYPE } from '../QueryBuilder_Const.js';
|
44
44
|
import {
|
45
45
|
type QueryBuilderExplorerTreeNodeData,
|
@@ -116,7 +116,9 @@ const QueryBuilderTreeNodeViewer = observer(
|
|
116
116
|
props;
|
117
117
|
const [isExpandable, setIsExpandable] = useState(false);
|
118
118
|
const propertySearchPanelState = explorerState.propertySearchPanelState;
|
119
|
-
const [, dragConnector, dragPreviewConnector] = useDrag
|
119
|
+
const [, dragConnector, dragPreviewConnector] = useDrag<{
|
120
|
+
node?: QueryBuilderExplorerTreePropertyNodeData;
|
121
|
+
}>(
|
120
122
|
() => ({
|
121
123
|
type:
|
122
124
|
node instanceof QueryBuilderExplorerTreePropertyNodeData
|
@@ -126,16 +128,17 @@ const QueryBuilderTreeNodeViewer = observer(
|
|
126
128
|
? QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.CLASS_PROPERTY
|
127
129
|
: QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY
|
128
130
|
: QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ROOT,
|
129
|
-
item: ()
|
131
|
+
item: () =>
|
130
132
|
node instanceof QueryBuilderExplorerTreePropertyNodeData
|
131
133
|
? { node }
|
132
134
|
: {},
|
133
|
-
collect: (monitor)
|
135
|
+
collect: (monitor) => ({
|
134
136
|
isDragging: monitor.isDragging(),
|
135
137
|
}),
|
136
138
|
}),
|
137
139
|
[node],
|
138
140
|
);
|
141
|
+
useDragPreviewLayer(dragPreviewConnector);
|
139
142
|
const isMultiple =
|
140
143
|
(node instanceof QueryBuilderExplorerTreePropertyNodeData &&
|
141
144
|
(node.property.multiplicity.upperBound === undefined ||
|
@@ -186,10 +189,6 @@ const QueryBuilderTreeNodeViewer = observer(
|
|
186
189
|
node.parentId === pn.id,
|
187
190
|
);
|
188
191
|
|
189
|
-
useEffect(() => {
|
190
|
-
dragPreviewConnector(getEmptyImage(), { captureDraggingState: true });
|
191
|
-
}, [dragPreviewConnector]);
|
192
|
-
|
193
192
|
return (
|
194
193
|
<div>
|
195
194
|
<div
|
@@ -32,6 +32,7 @@ import {
|
|
32
32
|
import type { QueryBuilderState } from '../stores/QueryBuilderState.js';
|
33
33
|
import type { QueryBuilderProjectionColumnState } from '../stores/QueryBuilderProjectionState.js';
|
34
34
|
import { guaranteeNonNullable } from '@finos/legend-shared';
|
35
|
+
import { useApplicationStore } from '@finos/legend-application';
|
35
36
|
|
36
37
|
const ColumnSortEditor = observer(
|
37
38
|
(props: {
|
@@ -39,6 +40,7 @@ const ColumnSortEditor = observer(
|
|
39
40
|
columnSort: SortColumnState;
|
40
41
|
}) => {
|
41
42
|
const { queryBuilderState, columnSort } = props;
|
43
|
+
const applicationStore = useApplicationStore();
|
42
44
|
const projectionState =
|
43
45
|
queryBuilderState.fetchStructureState.projectionState;
|
44
46
|
const sortColumns = queryBuilderState.resultSetModifierState.sortColumns;
|
@@ -81,7 +83,7 @@ const ColumnSortEditor = observer(
|
|
81
83
|
disabled={projectionOptions.length <= 1}
|
82
84
|
onChange={onChange}
|
83
85
|
value={value}
|
84
|
-
darkMode={
|
86
|
+
darkMode={!applicationStore.TEMPORARY__isLightThemeEnabled}
|
85
87
|
/>
|
86
88
|
<button
|
87
89
|
className="btn--dark btn--sm query-builder__projection__options__sort__type-btn"
|
@@ -95,7 +97,7 @@ const ColumnSortEditor = observer(
|
|
95
97
|
)}
|
96
98
|
</button>
|
97
99
|
<button
|
98
|
-
className="query-builder__projection__options__sort__remove-btn"
|
100
|
+
className="query-builder__projection__options__sort__remove-btn btn--dark btn--caution"
|
99
101
|
onClick={deleteColumnSort}
|
100
102
|
tabIndex={-1}
|
101
103
|
title={'Remove'}
|
@@ -288,6 +288,61 @@ const QueryBuilderResultContextMenu = observer(
|
|
288
288
|
}),
|
289
289
|
);
|
290
290
|
|
291
|
+
const QueryBuilderGridResult = observer(
|
292
|
+
(props: {
|
293
|
+
executionResult: TdsExecutionResult;
|
294
|
+
queryBuilderState: QueryBuilderState;
|
295
|
+
}) => {
|
296
|
+
const { executionResult, queryBuilderState } = props;
|
297
|
+
const [cellDoubleClickedEvent, setCellDoubleClickedEvent] =
|
298
|
+
useState<CellMouseOverEvent | null>(null);
|
299
|
+
const columns = executionResult.result.columns;
|
300
|
+
const rowData = executionResult.result.rows.map((_row) => {
|
301
|
+
const row: Record<PropertyKey, unknown> = {};
|
302
|
+
const cols = executionResult.result.columns;
|
303
|
+
_row.values.forEach((value, idx) => {
|
304
|
+
// `ag-grid` shows `false` value as empty string so we have
|
305
|
+
// call `.toString()` to avoid this behavior.
|
306
|
+
// See https://github.com/finos/legend-studio/issues/1008
|
307
|
+
row[cols[idx] as string] = isBoolean(value) ? String(value) : value;
|
308
|
+
});
|
309
|
+
return row;
|
310
|
+
});
|
311
|
+
|
312
|
+
return (
|
313
|
+
<ContextMenu
|
314
|
+
content={
|
315
|
+
<QueryBuilderResultContextMenu
|
316
|
+
event={cellDoubleClickedEvent}
|
317
|
+
queryBuilderState={queryBuilderState}
|
318
|
+
/>
|
319
|
+
}
|
320
|
+
menuProps={{ elevation: 7 }}
|
321
|
+
key={executionResult._UUID}
|
322
|
+
className={clsx('ag-theme-balham-dark query-builder__result__tds-grid')}
|
323
|
+
>
|
324
|
+
<AgGridReact
|
325
|
+
rowData={rowData}
|
326
|
+
onCellMouseOver={(event): void => {
|
327
|
+
setCellDoubleClickedEvent(event);
|
328
|
+
}}
|
329
|
+
>
|
330
|
+
{columns.map((colName) => (
|
331
|
+
<AgGridColumn
|
332
|
+
minWidth={50}
|
333
|
+
sortable={true}
|
334
|
+
resizable={true}
|
335
|
+
field={colName}
|
336
|
+
key={colName}
|
337
|
+
flex={1}
|
338
|
+
/>
|
339
|
+
))}
|
340
|
+
</AgGridReact>
|
341
|
+
</ContextMenu>
|
342
|
+
);
|
343
|
+
},
|
344
|
+
);
|
345
|
+
|
291
346
|
const QueryBuilderResultValues = observer(
|
292
347
|
(props: {
|
293
348
|
executionResult: ExecutionResult;
|
@@ -295,52 +350,11 @@ const QueryBuilderResultValues = observer(
|
|
295
350
|
}) => {
|
296
351
|
const { executionResult, queryBuilderState } = props;
|
297
352
|
if (executionResult instanceof TdsExecutionResult) {
|
298
|
-
const [cellDoubleClickedEvent, setCellDoubleClickedEvent] =
|
299
|
-
useState<CellMouseOverEvent | null>(null);
|
300
|
-
const columns = executionResult.result.columns;
|
301
|
-
const rowData = executionResult.result.rows.map((_row) => {
|
302
|
-
const row: Record<PropertyKey, unknown> = {};
|
303
|
-
const cols = executionResult.result.columns;
|
304
|
-
_row.values.forEach((value, idx) => {
|
305
|
-
// `ag-grid` shows `false` value as empty string so we have
|
306
|
-
// call `.toString()` to avoid this behavior.
|
307
|
-
// See https://github.com/finos/legend-studio/issues/1008
|
308
|
-
row[cols[idx] as string] = isBoolean(value) ? String(value) : value;
|
309
|
-
});
|
310
|
-
return row;
|
311
|
-
});
|
312
353
|
return (
|
313
|
-
<
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
queryBuilderState={queryBuilderState}
|
318
|
-
/>
|
319
|
-
}
|
320
|
-
menuProps={{ elevation: 7 }}
|
321
|
-
key={executionResult._UUID}
|
322
|
-
className={clsx(
|
323
|
-
'ag-theme-balham-dark query-builder__result__tds-grid',
|
324
|
-
)}
|
325
|
-
>
|
326
|
-
<AgGridReact
|
327
|
-
rowData={rowData}
|
328
|
-
onCellMouseOver={(event): void => {
|
329
|
-
setCellDoubleClickedEvent(event);
|
330
|
-
}}
|
331
|
-
>
|
332
|
-
{columns.map((colName) => (
|
333
|
-
<AgGridColumn
|
334
|
-
minWidth={50}
|
335
|
-
sortable={true}
|
336
|
-
resizable={true}
|
337
|
-
field={colName}
|
338
|
-
key={colName}
|
339
|
-
flex={1}
|
340
|
-
/>
|
341
|
-
))}
|
342
|
-
</AgGridReact>
|
343
|
-
</ContextMenu>
|
354
|
+
<QueryBuilderGridResult
|
355
|
+
queryBuilderState={queryBuilderState}
|
356
|
+
executionResult={executionResult}
|
357
|
+
/>
|
344
358
|
);
|
345
359
|
} else if (executionResult instanceof RawExecutionResult) {
|
346
360
|
return (
|
@@ -414,6 +428,9 @@ export const QueryBuilderResultPanel = observer(
|
|
414
428
|
],
|
415
429
|
});
|
416
430
|
};
|
431
|
+
const queryValidationIssues = queryBuilderState.validationIssues;
|
432
|
+
const isQueryValid =
|
433
|
+
!queryBuilderState.isQuerySupported() || !queryValidationIssues;
|
417
434
|
const runQuery = (): void => {
|
418
435
|
if (queryParametersState.parameterStates.length) {
|
419
436
|
queryParametersState.parameterValuesEditorState.open(
|
@@ -439,6 +456,7 @@ export const QueryBuilderResultPanel = observer(
|
|
439
456
|
const debugPlanGeneration = applicationStore.guardUnhandledError(() =>
|
440
457
|
flowResult(resultState.generatePlan(true)),
|
441
458
|
);
|
459
|
+
|
442
460
|
const changeLimit: React.ChangeEventHandler<HTMLInputElement> = (event) => {
|
443
461
|
const val = event.target.value;
|
444
462
|
queryBuilderState.resultState.setPreviewLimit(
|
@@ -474,7 +492,7 @@ export const QueryBuilderResultPanel = observer(
|
|
474
492
|
type="number"
|
475
493
|
value={resultState.previewLimit}
|
476
494
|
onChange={changeLimit}
|
477
|
-
disabled={!
|
495
|
+
disabled={!isQueryValid}
|
478
496
|
/>
|
479
497
|
</div>
|
480
498
|
)}
|
@@ -483,7 +501,7 @@ export const QueryBuilderResultPanel = observer(
|
|
483
501
|
className="query-builder__result__stop-btn"
|
484
502
|
onClick={cancelQuery}
|
485
503
|
tabIndex={-1}
|
486
|
-
disabled={!
|
504
|
+
disabled={!isQueryValid}
|
487
505
|
>
|
488
506
|
<div className="btn--dark btn--caution query-builder__result__stop-btn__label">
|
489
507
|
<PauseCircleIcon className="query-builder__result__stop-btn__label__icon" />
|
@@ -497,7 +515,14 @@ export const QueryBuilderResultPanel = observer(
|
|
497
515
|
className="query-builder__result__execute-btn"
|
498
516
|
onClick={runQuery}
|
499
517
|
tabIndex={-1}
|
500
|
-
|
518
|
+
title={
|
519
|
+
queryValidationIssues
|
520
|
+
? `Query is not valid:\n${queryValidationIssues
|
521
|
+
.map((issue) => `\u2022 ${issue}`)
|
522
|
+
.join('\n')}`
|
523
|
+
: undefined
|
524
|
+
}
|
525
|
+
disabled={!isQueryValid}
|
501
526
|
>
|
502
527
|
<div className="query-builder__result__execute-btn__label">
|
503
528
|
<PlayIcon className="query-builder__result__execute-btn__label__icon" />
|
@@ -560,14 +585,14 @@ export const QueryBuilderResultPanel = observer(
|
|
560
585
|
className="query-builder__result__export__dropdown__label"
|
561
586
|
tabIndex={-1}
|
562
587
|
title="Export"
|
563
|
-
disabled={!
|
588
|
+
disabled={!isQueryValid}
|
564
589
|
>
|
565
590
|
Export
|
566
591
|
</button>
|
567
592
|
<button
|
568
593
|
className="query-builder__result__export__dropdown__trigger"
|
569
594
|
tabIndex={-1}
|
570
|
-
disabled={!
|
595
|
+
disabled={!isQueryValid}
|
571
596
|
>
|
572
597
|
<CaretDownIcon />
|
573
598
|
</button>
|
@@ -21,7 +21,6 @@ import {
|
|
21
21
|
PURE_ClassIcon,
|
22
22
|
PURE_MappingIcon,
|
23
23
|
PURE_RuntimeIcon,
|
24
|
-
EyeIcon,
|
25
24
|
ClockIcon,
|
26
25
|
clsx,
|
27
26
|
} from '@finos/legend-art';
|
@@ -46,8 +45,9 @@ import {
|
|
46
45
|
} from '@finos/legend-graph';
|
47
46
|
import {
|
48
47
|
type PackageableElementOption,
|
49
|
-
|
48
|
+
getPackageableElementOptionFormatter,
|
50
49
|
buildElementOption,
|
50
|
+
useApplicationStore,
|
51
51
|
} from '@finos/legend-application';
|
52
52
|
import { MilestoningParametersEditor } from './QueryBuilderMilestoneEditor.js';
|
53
53
|
import { useState } from 'react';
|
@@ -124,8 +124,8 @@ const generateClassLabel = (
|
|
124
124
|
>
|
125
125
|
{val.name}
|
126
126
|
</div>
|
127
|
-
<
|
128
|
-
className="query-builder__setup__config__item__class-
|
127
|
+
<ClockIcon
|
128
|
+
className="query-builder__setup__config__item__class-label__milestoning"
|
129
129
|
title={milestoningParameterValues}
|
130
130
|
/>
|
131
131
|
</div>
|
@@ -151,6 +151,7 @@ const generateClassLabel = (
|
|
151
151
|
export const QueryBuilderSetupPanel = observer(
|
152
152
|
(props: { queryBuilderState: QueryBuilderState }) => {
|
153
153
|
const { queryBuilderState } = props;
|
154
|
+
const applicationStore = useApplicationStore();
|
154
155
|
const querySetupState = queryBuilderState.querySetupState;
|
155
156
|
const [isMilestoneEditorOpened, setIsMilestoneEditorOpened] =
|
156
157
|
useState<boolean>(false);
|
@@ -266,15 +267,15 @@ export const QueryBuilderSetupPanel = observer(
|
|
266
267
|
options={classOptions}
|
267
268
|
onChange={changeClass}
|
268
269
|
value={selectedClassOption}
|
269
|
-
darkMode={
|
270
|
+
darkMode={!applicationStore.TEMPORARY__isLightThemeEnabled}
|
270
271
|
disabled={!isQuerySupported || querySetupState.classIsReadOnly}
|
271
272
|
filterOption={elementFilterOption}
|
272
|
-
formatOptionLabel={
|
273
|
-
darkMode:
|
273
|
+
formatOptionLabel={getPackageableElementOptionFormatter({
|
274
|
+
darkMode: !applicationStore.TEMPORARY__isLightThemeEnabled,
|
274
275
|
})}
|
275
276
|
/>
|
276
277
|
<button
|
277
|
-
className="btn--dark btn__icon--dark"
|
278
|
+
className="btn--dark btn__icon--dark query-builder__setup__milestoning"
|
278
279
|
tabIndex={-1}
|
279
280
|
onClick={(): void => setIsMilestoneEditorOpened(true)}
|
280
281
|
disabled={!isMilestonedQuery}
|
@@ -302,10 +303,10 @@ export const QueryBuilderSetupPanel = observer(
|
|
302
303
|
options={mappingOptions}
|
303
304
|
onChange={changeMapping}
|
304
305
|
value={selectedMappingOption}
|
305
|
-
darkMode={
|
306
|
+
darkMode={!applicationStore.TEMPORARY__isLightThemeEnabled}
|
306
307
|
filterOption={elementFilterOption}
|
307
|
-
formatOptionLabel={
|
308
|
-
darkMode:
|
308
|
+
formatOptionLabel={getPackageableElementOptionFormatter({
|
309
|
+
darkMode: !applicationStore.TEMPORARY__isLightThemeEnabled,
|
309
310
|
})}
|
310
311
|
/>
|
311
312
|
</div>
|
@@ -330,7 +331,7 @@ export const QueryBuilderSetupPanel = observer(
|
|
330
331
|
options={runtimeOptions}
|
331
332
|
onChange={changeRuntime}
|
332
333
|
value={selectedRuntimeOption}
|
333
|
-
darkMode={
|
334
|
+
darkMode={!applicationStore.TEMPORARY__isLightThemeEnabled}
|
334
335
|
filterOption={runtimeFilterOption}
|
335
336
|
/>
|
336
337
|
</div>
|
@@ -48,7 +48,9 @@ const QueryBuilderUnsupportedQueryEditPanel = observer(
|
|
48
48
|
const { queryBuilderState } = props;
|
49
49
|
const queryUnsupportedState = queryBuilderState.queryUnsupportedState;
|
50
50
|
const lambdaError = queryUnsupportedState.lambdaError;
|
51
|
-
const errorMessage = lambdaError
|
51
|
+
const errorMessage = lambdaError?.message
|
52
|
+
? ` due to: ${lambdaError.message}`
|
53
|
+
: '';
|
52
54
|
const openLambdaModal = (): void =>
|
53
55
|
queryBuilderState.queryTextEditorState.openModal(
|
54
56
|
QueryTextEditorMode.TEXT,
|
@@ -63,7 +65,7 @@ const QueryBuilderUnsupportedQueryEditPanel = observer(
|
|
63
65
|
<div className="panel__content">
|
64
66
|
<BlankPanelContent>
|
65
67
|
<div className="query-builder__unsupported-view__main">
|
66
|
-
<div className="query-builder__unsupported-view__summary">{`Can't display query in form mode
|
68
|
+
<div className="query-builder__unsupported-view__summary">{`Can't display query in form mode${errorMessage}`}</div>
|
67
69
|
<button
|
68
70
|
className="btn--dark query-builder__unsupported-view__to-text-mode__btn"
|
69
71
|
onClick={openLambdaModal}
|
@@ -22,6 +22,9 @@ import {
|
|
22
22
|
RobotIcon,
|
23
23
|
SaveIcon,
|
24
24
|
BlankPanelContent,
|
25
|
+
clsx,
|
26
|
+
EmptyLightBulbIcon,
|
27
|
+
LightBulbIcon,
|
25
28
|
} from '@finos/legend-art';
|
26
29
|
import { getQueryParameters } from '@finos/legend-shared';
|
27
30
|
import { observer } from 'mobx-react-lite';
|
@@ -108,6 +111,8 @@ const QueryExportDialogContent = observer(
|
|
108
111
|
)}
|
109
112
|
<button
|
110
113
|
className="btn modal__footer__close-btn btn--dark"
|
114
|
+
// TODO?: we should probably annotate here why,
|
115
|
+
// when we disable this action
|
111
116
|
disabled={!allowCreate}
|
112
117
|
onClick={create}
|
113
118
|
>
|
@@ -199,6 +204,10 @@ const QueryEditorHeaderContent = observer(() => {
|
|
199
204
|
),
|
200
205
|
);
|
201
206
|
};
|
207
|
+
const toggleLightDarkTheme = (): void =>
|
208
|
+
applicationStore.TEMPORARY__setIsLightThemeEnabled(
|
209
|
+
!applicationStore.TEMPORARY__isLightThemeEnabled,
|
210
|
+
);
|
202
211
|
const saveQuery = (): void => {
|
203
212
|
editorStore.queryBuilderState
|
204
213
|
.saveQuery(async (lambda: RawLambda) => {
|
@@ -227,6 +236,20 @@ const QueryEditorHeaderContent = observer(() => {
|
|
227
236
|
>
|
228
237
|
<ExternalLinkSquareIcon />
|
229
238
|
</button>
|
239
|
+
{applicationStore.config.options.TEMPORARY__enableThemeSwitcher && (
|
240
|
+
<button
|
241
|
+
className="query-editor__header__action query-editor__header__action--simple btn--dark"
|
242
|
+
tabIndex={-1}
|
243
|
+
title="Toggle Light/Dark Theme"
|
244
|
+
onClick={toggleLightDarkTheme}
|
245
|
+
>
|
246
|
+
{applicationStore.TEMPORARY__isLightThemeEnabled ? (
|
247
|
+
<EmptyLightBulbIcon />
|
248
|
+
) : (
|
249
|
+
<LightBulbIcon />
|
250
|
+
)}
|
251
|
+
</button>
|
252
|
+
)}
|
230
253
|
<button
|
231
254
|
className="query-editor__header__action btn--dark"
|
232
255
|
tabIndex={-1}
|
@@ -256,9 +279,24 @@ export const QueryEditor = observer(() => {
|
|
256
279
|
);
|
257
280
|
}, [editorStore, applicationStore]);
|
258
281
|
|
282
|
+
useEffect(() => {
|
283
|
+
document.body.classList.toggle(
|
284
|
+
'light-theme',
|
285
|
+
applicationStore.TEMPORARY__isLightThemeEnabled,
|
286
|
+
);
|
287
|
+
}, [applicationStore.TEMPORARY__isLightThemeEnabled]);
|
288
|
+
|
259
289
|
return (
|
260
290
|
<DndProvider backend={HTML5Backend}>
|
261
|
-
<div
|
291
|
+
<div
|
292
|
+
className={clsx([
|
293
|
+
'query-editor ',
|
294
|
+
{
|
295
|
+
'query-editor--light':
|
296
|
+
applicationStore.TEMPORARY__isLightThemeEnabled,
|
297
|
+
},
|
298
|
+
])}
|
299
|
+
>
|
262
300
|
<div className="query-editor__header">
|
263
301
|
<button
|
264
302
|
className="query-editor__header__back-btn btn--dark"
|
@@ -42,6 +42,11 @@ import {
|
|
42
42
|
WebApplicationNavigator,
|
43
43
|
TEST__getTestApplicationStore,
|
44
44
|
} from '@finos/legend-application';
|
45
|
+
import {
|
46
|
+
type SDLCServerClient,
|
47
|
+
TEST__SDLCServerClientProvider,
|
48
|
+
TEST__getTestSDLCServerClient,
|
49
|
+
} from '@finos/legend-server-sdlc';
|
45
50
|
import { TEST__getTestLegendQueryApplicationConfig } from '../stores/QueryEditorStoreTestUtils.js';
|
46
51
|
import { LegendQueryPluginManager } from '../application/LegendQueryPluginManager.js';
|
47
52
|
import { ExistingQueryEditor } from './QueryEditor.js';
|
@@ -68,6 +73,8 @@ export const TEST__provideMockedQueryEditorStore = (customization?: {
|
|
68
73
|
mock?: ExistingQueryEditorStore;
|
69
74
|
applicationStore?: LegendQueryApplicationStore;
|
70
75
|
depotServerClient?: DepotServerClient;
|
76
|
+
sdlcServerClient?: SDLCServerClient;
|
77
|
+
|
71
78
|
graphManagerState?: GraphManagerState;
|
72
79
|
pluginManager?: LegendQueryPluginManager;
|
73
80
|
}): ExistingQueryEditorStore => {
|
@@ -82,6 +89,7 @@ export const TEST__provideMockedQueryEditorStore = (customization?: {
|
|
82
89
|
pluginManager,
|
83
90
|
),
|
84
91
|
customization?.depotServerClient ?? TEST__getTestDepotServerClient(),
|
92
|
+
customization?.sdlcServerClient ?? TEST__getTestSDLCServerClient(),
|
85
93
|
pluginManager,
|
86
94
|
TEST_QUERY_ID,
|
87
95
|
);
|
@@ -185,11 +193,13 @@ export const TEST__setUpQueryEditor = async (
|
|
185
193
|
config={TEST__getTestLegendQueryApplicationConfig()}
|
186
194
|
pluginManager={LegendQueryPluginManager.create()}
|
187
195
|
>
|
188
|
-
<
|
189
|
-
<
|
190
|
-
<
|
191
|
-
|
192
|
-
|
196
|
+
<TEST__SDLCServerClientProvider>
|
197
|
+
<TEST__DepotServerClientProvider>
|
198
|
+
<TEST__LegendQueryBaseStoreProvider>
|
199
|
+
<ExistingQueryEditor />
|
200
|
+
</TEST__LegendQueryBaseStoreProvider>
|
201
|
+
</TEST__DepotServerClientProvider>
|
202
|
+
</TEST__SDLCServerClientProvider>
|
193
203
|
</TEST__ApplicationStoreProvider>
|
194
204
|
</Router>,
|
195
205
|
);
|
@@ -31,6 +31,7 @@ import {
|
|
31
31
|
useLegendQueryApplicationStore,
|
32
32
|
useLegendQueryBaseStore,
|
33
33
|
} from './LegendQueryBaseStoreProvider.js';
|
34
|
+
import { useSDLCServerClient } from '@finos/legend-server-sdlc';
|
34
35
|
|
35
36
|
export const QueryEditorStoreContext = createContext<
|
36
37
|
QueryEditorStore | undefined
|
@@ -42,12 +43,14 @@ export const ExistingQueryEditorStoreProvider: React.FC<{
|
|
42
43
|
}> = ({ children, queryId }) => {
|
43
44
|
const applicationStore = useLegendQueryApplicationStore();
|
44
45
|
const depotServerClient = useDepotServerClient();
|
46
|
+
const sdlcServerClient = useSDLCServerClient();
|
45
47
|
const baseStore = useLegendQueryBaseStore();
|
46
48
|
const store = useLocalObservable(
|
47
49
|
() =>
|
48
50
|
new ExistingQueryEditorStore(
|
49
51
|
applicationStore,
|
50
52
|
depotServerClient,
|
53
|
+
sdlcServerClient,
|
51
54
|
baseStore.pluginManager,
|
52
55
|
queryId,
|
53
56
|
),
|
@@ -69,12 +72,14 @@ export const CreateQueryEditorStoreProvider: React.FC<{
|
|
69
72
|
const { groupId, artifactId, versionId } = parseGAVCoordinates(gav);
|
70
73
|
const applicationStore = useLegendQueryApplicationStore();
|
71
74
|
const depotServerClient = useDepotServerClient();
|
75
|
+
const sdlcServerClient = useSDLCServerClient();
|
72
76
|
const baseStore = useLegendQueryBaseStore();
|
73
77
|
const store = useLocalObservable(
|
74
78
|
() =>
|
75
79
|
new CreateQueryEditorStore(
|
76
80
|
applicationStore,
|
77
81
|
depotServerClient,
|
82
|
+
sdlcServerClient,
|
78
83
|
baseStore.pluginManager,
|
79
84
|
groupId,
|
80
85
|
artifactId,
|
@@ -100,12 +105,14 @@ export const ServiceQueryEditorStoreProvider: React.FC<{
|
|
100
105
|
const { groupId, artifactId, versionId } = parseGAVCoordinates(gav);
|
101
106
|
const applicationStore = useLegendQueryApplicationStore();
|
102
107
|
const depotServerClient = useDepotServerClient();
|
108
|
+
const sdlcServerClient = useSDLCServerClient();
|
103
109
|
const baseStore = useLegendQueryBaseStore();
|
104
110
|
const store = useLocalObservable(
|
105
111
|
() =>
|
106
112
|
new ServiceQueryEditorStore(
|
107
113
|
applicationStore,
|
108
114
|
depotServerClient,
|
115
|
+
sdlcServerClient,
|
109
116
|
baseStore.pluginManager,
|
110
117
|
groupId,
|
111
118
|
artifactId,
|
@@ -23,6 +23,7 @@ import {
|
|
23
23
|
useLegendQueryApplicationStore,
|
24
24
|
useLegendQueryBaseStore,
|
25
25
|
} from './LegendQueryBaseStoreProvider.js';
|
26
|
+
import { useSDLCServerClient } from '@finos/legend-server-sdlc';
|
26
27
|
|
27
28
|
const QuerySetupStoreContext = createContext<QuerySetupStore | undefined>(
|
28
29
|
undefined,
|
@@ -34,11 +35,13 @@ export const QuerySetupStoreProvider: React.FC<{
|
|
34
35
|
const applicationStore = useLegendQueryApplicationStore();
|
35
36
|
const depotServerClient = useDepotServerClient();
|
36
37
|
const baseStore = useLegendQueryBaseStore();
|
38
|
+
const sdlcServerClient = useSDLCServerClient();
|
37
39
|
const store = useLocalObservable(
|
38
40
|
() =>
|
39
41
|
new QuerySetupStore(
|
40
42
|
applicationStore,
|
41
43
|
depotServerClient,
|
44
|
+
sdlcServerClient,
|
42
45
|
baseStore.pluginManager,
|
43
46
|
),
|
44
47
|
);
|
@@ -15,10 +15,14 @@
|
|
15
15
|
*/
|
16
16
|
|
17
17
|
import type { DepotServerClient } from '@finos/legend-server-depot';
|
18
|
-
import
|
18
|
+
import {
|
19
|
+
type ApplicationStore,
|
20
|
+
LegendApplicationSDLCSetupState,
|
21
|
+
} from '@finos/legend-application';
|
19
22
|
import type { LegendQueryPluginManager } from '../application/LegendQueryPluginManager.js';
|
20
23
|
import type { LegendQueryApplicationConfig } from '../application/LegendQueryApplicationConfig.js';
|
21
24
|
import type { LegendQueryApplicationPlugin } from './LegendQueryApplicationPlugin.js';
|
25
|
+
import type { SDLCServerClient } from '@finos/legend-server-sdlc';
|
22
26
|
|
23
27
|
export type LegendQueryApplicationStore = ApplicationStore<
|
24
28
|
LegendQueryApplicationConfig,
|
@@ -29,17 +33,26 @@ export class LegendQueryBaseStore {
|
|
29
33
|
applicationStore: LegendQueryApplicationStore;
|
30
34
|
depotServerClient: DepotServerClient;
|
31
35
|
pluginManager: LegendQueryPluginManager;
|
36
|
+
applicationSDLCSetupState: LegendApplicationSDLCSetupState;
|
32
37
|
|
33
38
|
constructor(
|
34
39
|
applicationStore: LegendQueryApplicationStore,
|
35
40
|
depotServerClient: DepotServerClient,
|
41
|
+
sdlcServerClient: SDLCServerClient,
|
36
42
|
pluginManager: LegendQueryPluginManager,
|
37
43
|
) {
|
38
44
|
this.applicationStore = applicationStore;
|
45
|
+
this.applicationSDLCSetupState = new LegendApplicationSDLCSetupState(
|
46
|
+
applicationStore,
|
47
|
+
sdlcServerClient,
|
48
|
+
);
|
39
49
|
this.depotServerClient = depotServerClient;
|
40
50
|
this.pluginManager = pluginManager;
|
41
51
|
|
42
52
|
// Register plugins
|
53
|
+
this.applicationSDLCSetupState.sdlcServerClient.setTracerService(
|
54
|
+
this.applicationStore.tracerService,
|
55
|
+
);
|
43
56
|
this.depotServerClient.setTracerService(
|
44
57
|
this.applicationStore.tracerService,
|
45
58
|
);
|
@@ -355,6 +355,11 @@ export const getQueryBuilderPropertyNodeData = (
|
|
355
355
|
parentNode.isPartOfDerivedPropertyBranch ||
|
356
356
|
(parentNode instanceof QueryBuilderExplorerTreePropertyNodeData &&
|
357
357
|
parentNode.property instanceof DerivedProperty);
|
358
|
+
// NOTE: in case of association, to avoid infinite exploration path
|
359
|
+
// we will prune it, on the other hand, in circular composition case
|
360
|
+
// A has property of type B and B has property of type A
|
361
|
+
// we will allow users to explore as deeply as they wish
|
362
|
+
// See https://github.com/finos/legend-studio/issues/1172
|
358
363
|
if (
|
359
364
|
property instanceof Property &&
|
360
365
|
parentNode instanceof QueryBuilderExplorerTreePropertyNodeData &&
|