@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,7 +14,7 @@
|
|
14
14
|
* limitations under the License.
|
15
15
|
*/
|
16
16
|
|
17
|
-
import {
|
17
|
+
import { useRef, useState, useCallback, forwardRef, useMemo } from 'react';
|
18
18
|
import { observer } from 'mobx-react-lite';
|
19
19
|
import {
|
20
20
|
type TreeNodeContainerProps,
|
@@ -38,6 +38,10 @@ import {
|
|
38
38
|
ChevronRightIcon,
|
39
39
|
PlusCircleIcon,
|
40
40
|
TimesIcon,
|
41
|
+
PanelDropZone,
|
42
|
+
DragPreviewLayer,
|
43
|
+
PanelEntryDropZonePlaceholder,
|
44
|
+
useDragPreviewLayer,
|
41
45
|
} from '@finos/legend-art';
|
42
46
|
import {
|
43
47
|
type QueryBuilderFilterConditionDragSource,
|
@@ -50,13 +54,7 @@ import {
|
|
50
54
|
QueryBuilderFilterTreeBlankConditionNodeData,
|
51
55
|
QueryBuilderFilterTreeGroupNodeData,
|
52
56
|
} from '../stores/QueryBuilderFilterState.js';
|
53
|
-
import {
|
54
|
-
type DropTargetMonitor,
|
55
|
-
useDragLayer,
|
56
|
-
useDrag,
|
57
|
-
useDrop,
|
58
|
-
} from 'react-dnd';
|
59
|
-
import { getEmptyImage } from 'react-dnd-html5-backend';
|
57
|
+
import { useDrag, useDrop } from 'react-dnd';
|
60
58
|
import {
|
61
59
|
type QueryBuilderExplorerTreeDragSource,
|
62
60
|
type QueryBuilderExplorerTreePropertyNodeData,
|
@@ -67,6 +65,7 @@ import { QueryBuilderPropertyExpressionBadge } from './QueryBuilderPropertyExpre
|
|
67
65
|
import type { QueryBuilderState } from '../stores/QueryBuilderState.js';
|
68
66
|
import {
|
69
67
|
assertErrorThrown,
|
68
|
+
debounce,
|
70
69
|
UnsupportedOperationError,
|
71
70
|
} from '@finos/legend-shared';
|
72
71
|
import { QUERY_BUILDER_TEST_ID } from './QueryBuilder_TestID.js';
|
@@ -76,7 +75,7 @@ import {
|
|
76
75
|
} from '@finos/legend-application';
|
77
76
|
import {
|
78
77
|
type QueryBuilderParameterDragSource,
|
79
|
-
|
78
|
+
QUERY_BUILDER_PARAMETER_DND_TYPE,
|
80
79
|
} from '../stores/QueryParametersState.js';
|
81
80
|
import {
|
82
81
|
isTypeCompatibleWithConditionValueType,
|
@@ -86,54 +85,15 @@ import type { ValueSpecification } from '@finos/legend-graph';
|
|
86
85
|
import {
|
87
86
|
type QueryBuilderProjectionColumnDragSource,
|
88
87
|
QueryBuilderSimpleProjectionColumnState,
|
89
|
-
|
88
|
+
QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE,
|
90
89
|
} from '../stores/QueryBuilderProjectionState.js';
|
91
90
|
|
92
|
-
const FilterConditionDragLayer: React.FC = () => {
|
93
|
-
const { itemType, item, isDragging, currentPosition } = useDragLayer(
|
94
|
-
(monitor) => ({
|
95
|
-
itemType: monitor.getItemType() as QUERY_BUILDER_FILTER_DND_TYPE,
|
96
|
-
item: monitor.getItem<QueryBuilderFilterConditionDragSource | null>(),
|
97
|
-
isDragging: monitor.isDragging(),
|
98
|
-
initialOffset: monitor.getInitialSourceClientOffset(),
|
99
|
-
currentPosition: monitor.getClientOffset(),
|
100
|
-
}),
|
101
|
-
);
|
102
|
-
|
103
|
-
if (
|
104
|
-
!isDragging ||
|
105
|
-
!item ||
|
106
|
-
!Object.values(QUERY_BUILDER_FILTER_DND_TYPE).includes(itemType)
|
107
|
-
) {
|
108
|
-
return null;
|
109
|
-
}
|
110
|
-
return (
|
111
|
-
<div className="query-builder-filter-tree__drag-preview-layer">
|
112
|
-
<div
|
113
|
-
className="query-builder-filter-tree__drag-preview"
|
114
|
-
// added some offset so the mouse doesn't overlap the label too much
|
115
|
-
style={
|
116
|
-
!currentPosition
|
117
|
-
? { display: 'none' }
|
118
|
-
: {
|
119
|
-
transform: `translate(${currentPosition.x + 20}px, ${
|
120
|
-
currentPosition.y + 10
|
121
|
-
}px)`,
|
122
|
-
}
|
123
|
-
}
|
124
|
-
>
|
125
|
-
{item.node.dragLayerLabel}
|
126
|
-
</div>
|
127
|
-
</div>
|
128
|
-
);
|
129
|
-
};
|
130
|
-
|
131
91
|
const QueryBuilderFilterGroupConditionEditor = observer(
|
132
92
|
(props: {
|
133
93
|
node: QueryBuilderFilterTreeGroupNodeData;
|
134
|
-
|
94
|
+
isDragOver: boolean;
|
135
95
|
}) => {
|
136
|
-
const { node,
|
96
|
+
const { node, isDragOver } = props;
|
137
97
|
const switchOperation: React.MouseEventHandler<HTMLDivElement> = (
|
138
98
|
event,
|
139
99
|
): void => {
|
@@ -145,29 +105,30 @@ const QueryBuilderFilterGroupConditionEditor = observer(
|
|
145
105
|
);
|
146
106
|
};
|
147
107
|
return (
|
148
|
-
<div className="query-builder-filter-tree__node__label__content
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
)}
|
154
|
-
<div
|
155
|
-
className={clsx('query-builder-filter-tree__group-node', {
|
156
|
-
'query-builder-filter-tree__group-node--and':
|
157
|
-
node.groupOperation === QUERY_BUILDER_GROUP_OPERATION.AND,
|
158
|
-
'query-builder-filter-tree__group-node--or':
|
159
|
-
node.groupOperation === QUERY_BUILDER_GROUP_OPERATION.OR,
|
160
|
-
})}
|
161
|
-
title="Switch Operation"
|
162
|
-
onClick={switchOperation}
|
108
|
+
<div className="query-builder-filter-tree__node__label__content">
|
109
|
+
<PanelEntryDropZonePlaceholder
|
110
|
+
showPlaceholder={isDragOver}
|
111
|
+
label="Add to Logical Group"
|
112
|
+
className="query-builder__dnd__placeholder"
|
163
113
|
>
|
164
|
-
<div
|
165
|
-
{node
|
114
|
+
<div
|
115
|
+
className={clsx('query-builder-filter-tree__group-node', {
|
116
|
+
'query-builder-filter-tree__group-node--and':
|
117
|
+
node.groupOperation === QUERY_BUILDER_GROUP_OPERATION.AND,
|
118
|
+
'query-builder-filter-tree__group-node--or':
|
119
|
+
node.groupOperation === QUERY_BUILDER_GROUP_OPERATION.OR,
|
120
|
+
})}
|
121
|
+
title="Switch Operation"
|
122
|
+
onClick={switchOperation}
|
123
|
+
>
|
124
|
+
<div className="query-builder-filter-tree__group-node__label">
|
125
|
+
{node.groupOperation}
|
126
|
+
</div>
|
127
|
+
<button className="query-builder-filter-tree__group-node__action">
|
128
|
+
<FilledTriangleIcon />
|
129
|
+
</button>
|
166
130
|
</div>
|
167
|
-
|
168
|
-
<FilledTriangleIcon />
|
169
|
-
</button>
|
170
|
-
</div>
|
131
|
+
</PanelEntryDropZonePlaceholder>
|
171
132
|
</div>
|
172
133
|
);
|
173
134
|
},
|
@@ -176,9 +137,9 @@ const QueryBuilderFilterGroupConditionEditor = observer(
|
|
176
137
|
const QueryBuilderFilterConditionEditor = observer(
|
177
138
|
(props: {
|
178
139
|
node: QueryBuilderFilterTreeConditionNodeData;
|
179
|
-
|
140
|
+
isDragOver: boolean;
|
180
141
|
}) => {
|
181
|
-
const { node,
|
142
|
+
const { node, isDragOver } = props;
|
182
143
|
const graph =
|
183
144
|
node.condition.filterState.queryBuilderState.graphManagerState.graph;
|
184
145
|
const applicationStore = useApplicationStore();
|
@@ -220,18 +181,19 @@ const QueryBuilderFilterConditionEditor = observer(
|
|
220
181
|
},
|
221
182
|
[applicationStore, node.condition],
|
222
183
|
);
|
223
|
-
const [{ isFilterValueDragOver }, dropConnector] = useDrop
|
184
|
+
const [{ isFilterValueDragOver }, dropConnector] = useDrop<
|
185
|
+
QueryBuilderParameterDragSource,
|
186
|
+
void,
|
187
|
+
{ isFilterValueDragOver: boolean }
|
188
|
+
>(
|
224
189
|
() => ({
|
225
|
-
accept: [
|
226
|
-
drop: (
|
227
|
-
item: QueryBuilderParameterDragSource,
|
228
|
-
monitor: DropTargetMonitor,
|
229
|
-
): void => {
|
190
|
+
accept: [QUERY_BUILDER_PARAMETER_DND_TYPE],
|
191
|
+
drop: (item, monitor): void => {
|
230
192
|
if (!monitor.didDrop()) {
|
231
193
|
handleDrop(item);
|
232
|
-
}
|
194
|
+
} // prevent drop event propagation to accomondate for nested DnD
|
233
195
|
},
|
234
|
-
collect: (monitor)
|
196
|
+
collect: (monitor) => ({
|
235
197
|
isFilterValueDragOver: monitor.isOver({ shallow: true }),
|
236
198
|
}),
|
237
199
|
}),
|
@@ -242,79 +204,100 @@ const QueryBuilderFilterConditionEditor = observer(
|
|
242
204
|
node.condition.operator.getDefaultFilterConditionValue(node.condition),
|
243
205
|
);
|
244
206
|
};
|
207
|
+
const debouncedTypeaheadSearch = useMemo(
|
208
|
+
() =>
|
209
|
+
debounce(
|
210
|
+
(inputVal: string) => node.condition.handleTypeaheadSearch(),
|
211
|
+
1000,
|
212
|
+
),
|
213
|
+
[node],
|
214
|
+
);
|
215
|
+
const cleanUpReloadValues = (): void => {
|
216
|
+
node.condition.typeaheadSearchState.complete();
|
217
|
+
};
|
218
|
+
const changeValueSpecification = (val: ValueSpecification): void => {
|
219
|
+
node.condition.setValue(val);
|
220
|
+
};
|
221
|
+
const selectorConfig = {
|
222
|
+
values: node.condition.typeaheadSearchResults,
|
223
|
+
isLoading: node.condition.typeaheadSearchState.isInProgress,
|
224
|
+
reloadValues: debouncedTypeaheadSearch,
|
225
|
+
cleanUpReloadValues,
|
226
|
+
};
|
245
227
|
|
246
228
|
return (
|
247
|
-
<div className="query-builder-filter-tree__node__label__content
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
/>
|
259
|
-
</div>
|
260
|
-
<DropdownMenu
|
261
|
-
className="query-builder-filter-tree__condition-node__operator"
|
262
|
-
content={
|
263
|
-
<MenuContent>
|
264
|
-
{node.condition.operators.map((op) => (
|
265
|
-
<MenuContentItem
|
266
|
-
key={op.uuid}
|
267
|
-
className="query-builder-filter-tree__condition-node__operator__dropdown__option"
|
268
|
-
onClick={changeOperator(op)}
|
269
|
-
>
|
270
|
-
{op.getLabel(node.condition)}
|
271
|
-
</MenuContentItem>
|
272
|
-
))}
|
273
|
-
</MenuContent>
|
274
|
-
}
|
275
|
-
menuProps={{
|
276
|
-
anchorOrigin: { vertical: 'bottom', horizontal: 'left' },
|
277
|
-
transformOrigin: { vertical: 'top', horizontal: 'left' },
|
278
|
-
elevation: 7,
|
279
|
-
}}
|
280
|
-
>
|
281
|
-
<div className="query-builder-filter-tree__condition-node__operator__label">
|
282
|
-
{node.condition.operator.getLabel(node.condition)}
|
283
|
-
</div>
|
284
|
-
<button
|
285
|
-
className="query-builder-filter-tree__condition-node__operator__dropdown__trigger"
|
286
|
-
tabIndex={-1}
|
287
|
-
title="Choose Operator..."
|
288
|
-
>
|
289
|
-
<CaretDownIcon />
|
290
|
-
</button>
|
291
|
-
</DropdownMenu>
|
292
|
-
{node.condition.value && (
|
293
|
-
<div
|
294
|
-
ref={dropConnector}
|
295
|
-
className="query-builder-filter-tree__condition-node__value dnd__overlay__container"
|
296
|
-
>
|
297
|
-
{isFilterValueDragOver && (
|
298
|
-
<div className="query-builder-filter-tree__node__dnd__overlay">
|
299
|
-
Change Filter Value
|
300
|
-
</div>
|
301
|
-
)}
|
302
|
-
<BasicValueSpecificationEditor
|
303
|
-
valueSpecification={node.condition.value}
|
304
|
-
setValueSpecification={(val: ValueSpecification): void =>
|
305
|
-
node.condition.setValue(val)
|
306
|
-
}
|
307
|
-
graph={graph}
|
308
|
-
typeCheckOption={{
|
309
|
-
expectedType:
|
310
|
-
node.condition.propertyExpressionState.propertyExpression
|
311
|
-
.func.genericType.value.rawType,
|
312
|
-
}}
|
313
|
-
resetValue={resetNode}
|
229
|
+
<div className="query-builder-filter-tree__node__label__content">
|
230
|
+
<PanelEntryDropZonePlaceholder
|
231
|
+
showPlaceholder={isDragOver}
|
232
|
+
label="Add New Logical Group"
|
233
|
+
className="query-builder__dnd__placeholder"
|
234
|
+
>
|
235
|
+
<div className="query-builder-filter-tree__condition-node">
|
236
|
+
<div className="query-builder-filter-tree__condition-node__property">
|
237
|
+
<QueryBuilderPropertyExpressionBadge
|
238
|
+
propertyExpressionState={node.condition.propertyExpressionState}
|
239
|
+
onPropertyExpressionChange={changeProperty}
|
314
240
|
/>
|
315
241
|
</div>
|
316
|
-
|
317
|
-
|
242
|
+
<DropdownMenu
|
243
|
+
className="query-builder-filter-tree__condition-node__operator"
|
244
|
+
content={
|
245
|
+
<MenuContent>
|
246
|
+
{node.condition.operators.map((op) => (
|
247
|
+
<MenuContentItem
|
248
|
+
key={op.uuid}
|
249
|
+
className="query-builder-filter-tree__condition-node__operator__dropdown__option"
|
250
|
+
onClick={changeOperator(op)}
|
251
|
+
>
|
252
|
+
{op.getLabel(node.condition)}
|
253
|
+
</MenuContentItem>
|
254
|
+
))}
|
255
|
+
</MenuContent>
|
256
|
+
}
|
257
|
+
menuProps={{
|
258
|
+
anchorOrigin: { vertical: 'bottom', horizontal: 'left' },
|
259
|
+
transformOrigin: { vertical: 'top', horizontal: 'left' },
|
260
|
+
elevation: 7,
|
261
|
+
}}
|
262
|
+
>
|
263
|
+
<div className="query-builder-filter-tree__condition-node__operator__label">
|
264
|
+
{node.condition.operator.getLabel(node.condition)}
|
265
|
+
</div>
|
266
|
+
<button
|
267
|
+
className="query-builder-filter-tree__condition-node__operator__dropdown__trigger"
|
268
|
+
tabIndex={-1}
|
269
|
+
title="Choose Operator..."
|
270
|
+
>
|
271
|
+
<CaretDownIcon />
|
272
|
+
</button>
|
273
|
+
</DropdownMenu>
|
274
|
+
{node.condition.value && (
|
275
|
+
<div
|
276
|
+
ref={dropConnector}
|
277
|
+
className="query-builder-filter-tree__condition-node__value"
|
278
|
+
>
|
279
|
+
<PanelEntryDropZonePlaceholder
|
280
|
+
showPlaceholder={isFilterValueDragOver}
|
281
|
+
label="Change Filter Value"
|
282
|
+
className="query-builder__dnd__placeholder"
|
283
|
+
>
|
284
|
+
<BasicValueSpecificationEditor
|
285
|
+
valueSpecification={node.condition.value}
|
286
|
+
setValueSpecification={changeValueSpecification}
|
287
|
+
graph={graph}
|
288
|
+
typeCheckOption={{
|
289
|
+
expectedType:
|
290
|
+
node.condition.propertyExpressionState
|
291
|
+
.propertyExpression.func.genericType.value.rawType,
|
292
|
+
}}
|
293
|
+
resetValue={resetNode}
|
294
|
+
selectorConfig={selectorConfig}
|
295
|
+
/>
|
296
|
+
</PanelEntryDropZonePlaceholder>
|
297
|
+
</div>
|
298
|
+
)}
|
299
|
+
</div>
|
300
|
+
</PanelEntryDropZonePlaceholder>
|
318
301
|
</div>
|
319
302
|
);
|
320
303
|
},
|
@@ -323,17 +306,18 @@ const QueryBuilderFilterConditionEditor = observer(
|
|
323
306
|
const QueryBuilderFilterBlankConditionEditor = observer(
|
324
307
|
(props: {
|
325
308
|
node: QueryBuilderFilterTreeBlankConditionNodeData;
|
326
|
-
|
309
|
+
isDragOver: boolean;
|
327
310
|
}) => {
|
328
|
-
const {
|
311
|
+
const { isDragOver } = props;
|
329
312
|
return (
|
330
|
-
<div className="query-builder-filter-tree__node__label__content
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
313
|
+
<div className="query-builder-filter-tree__node__label__content">
|
314
|
+
<PanelEntryDropZonePlaceholder
|
315
|
+
showPlaceholder={isDragOver}
|
316
|
+
label="Create Condition"
|
317
|
+
className="query-builder__dnd__placeholder"
|
318
|
+
>
|
319
|
+
<div className="query-builder-filter-tree__blank-node">blank</div>
|
320
|
+
</PanelEntryDropZonePlaceholder>
|
337
321
|
</div>
|
338
322
|
);
|
339
323
|
},
|
@@ -468,50 +452,45 @@ const QueryBuilderFilterTreeNodeContainer = observer(
|
|
468
452
|
},
|
469
453
|
[applicationStore, filterState, node],
|
470
454
|
);
|
471
|
-
const [{
|
455
|
+
const [{ isDragOver }, dropConnector] = useDrop<
|
456
|
+
QueryBuilderFilterConditionDragSource,
|
457
|
+
void,
|
458
|
+
{ isDragOver: boolean }
|
459
|
+
>(
|
472
460
|
() => ({
|
473
461
|
accept: [
|
474
462
|
...Object.values(QUERY_BUILDER_FILTER_DND_TYPE),
|
475
463
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ENUM_PROPERTY,
|
476
464
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY,
|
477
465
|
],
|
478
|
-
drop: (
|
479
|
-
item: QueryBuilderFilterConditionDragSource,
|
480
|
-
monitor: DropTargetMonitor,
|
481
|
-
): void => {
|
466
|
+
drop: (item, monitor): void => {
|
482
467
|
if (!monitor.didDrop()) {
|
483
468
|
handleDrop(item, monitor.getItemType() as string);
|
484
469
|
} // prevent drop event propagation to accomondate for nested DnD
|
485
470
|
},
|
486
|
-
|
487
|
-
|
488
|
-
// // prevent dropping inside my direct ancestor
|
489
|
-
// return true;
|
490
|
-
// },
|
491
|
-
collect: (monitor): { isPropertyDragOver: boolean } => ({
|
492
|
-
isPropertyDragOver: monitor.isOver({ shallow: true }),
|
471
|
+
collect: (monitor) => ({
|
472
|
+
isDragOver: monitor.isOver({ shallow: true }),
|
493
473
|
}),
|
494
474
|
}),
|
495
475
|
[handleDrop],
|
496
476
|
);
|
497
|
-
const [, dragConnector, dragPreviewConnector] =
|
498
|
-
(
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
477
|
+
const [, dragConnector, dragPreviewConnector] =
|
478
|
+
useDrag<QueryBuilderFilterConditionDragSource>(
|
479
|
+
() => ({
|
480
|
+
type:
|
481
|
+
node instanceof QueryBuilderFilterTreeGroupNodeData
|
482
|
+
? QUERY_BUILDER_FILTER_DND_TYPE.GROUP_CONDITION
|
483
|
+
: node instanceof QueryBuilderFilterTreeConditionNodeData
|
484
|
+
? QUERY_BUILDER_FILTER_DND_TYPE.CONDITION
|
485
|
+
: QUERY_BUILDER_FILTER_DND_TYPE.BLANK_CONDITION,
|
486
|
+
item: () => ({ node }),
|
487
|
+
end: (): void => filterState.setRearrangingConditions(false),
|
488
|
+
}),
|
489
|
+
[node, filterState],
|
490
|
+
);
|
510
491
|
dragConnector(dropConnector(ref));
|
511
|
-
|
512
|
-
|
513
|
-
dragPreviewConnector(getEmptyImage(), { captureDraggingState: true });
|
514
|
-
}, [dragPreviewConnector]);
|
492
|
+
useDragPreviewLayer(dragPreviewConnector);
|
493
|
+
|
515
494
|
// context menu
|
516
495
|
const onContextMenuOpen = (): void => setIsSelectedFromContextMenu(true);
|
517
496
|
const onContextMenuClose = (): void => setIsSelectedFromContextMenu(false);
|
@@ -570,19 +549,19 @@ const QueryBuilderFilterTreeNodeContainer = observer(
|
|
570
549
|
{node instanceof QueryBuilderFilterTreeGroupNodeData && (
|
571
550
|
<QueryBuilderFilterGroupConditionEditor
|
572
551
|
node={node}
|
573
|
-
|
552
|
+
isDragOver={isDragOver}
|
574
553
|
/>
|
575
554
|
)}
|
576
555
|
{node instanceof QueryBuilderFilterTreeConditionNodeData && (
|
577
556
|
<QueryBuilderFilterConditionEditor
|
578
557
|
node={node}
|
579
|
-
|
558
|
+
isDragOver={isDragOver}
|
580
559
|
/>
|
581
560
|
)}
|
582
561
|
{node instanceof QueryBuilderFilterTreeBlankConditionNodeData && (
|
583
562
|
<QueryBuilderFilterBlankConditionEditor
|
584
563
|
node={node}
|
585
|
-
|
564
|
+
isDragOver={isDragOver}
|
586
565
|
/>
|
587
566
|
)}
|
588
567
|
</div>
|
@@ -740,7 +719,7 @@ export const QueryBuilderFilterPanel = observer(
|
|
740
719
|
let filterConditionState: FilterConditionState;
|
741
720
|
try {
|
742
721
|
let propertyExpression;
|
743
|
-
if (type ===
|
722
|
+
if (type === QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE) {
|
744
723
|
if (
|
745
724
|
(item as QueryBuilderProjectionColumnDragSource)
|
746
725
|
.columnState instanceof QueryBuilderSimpleProjectionColumnState
|
@@ -785,28 +764,29 @@ export const QueryBuilderFilterPanel = observer(
|
|
785
764
|
},
|
786
765
|
[applicationStore, filterState],
|
787
766
|
);
|
788
|
-
const [{
|
767
|
+
const [{ isDragOver }, dropTargetConnector] = useDrop<
|
768
|
+
QueryBuilderExplorerTreeDragSource,
|
769
|
+
void,
|
770
|
+
{ isDragOver: boolean }
|
771
|
+
>(
|
789
772
|
() => ({
|
790
|
-
accept:
|
773
|
+
accept: queryBuilderState.mode.isDnDProjectionToFilterSupported
|
791
774
|
? [
|
792
775
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ENUM_PROPERTY,
|
793
776
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY,
|
794
|
-
|
777
|
+
QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE,
|
795
778
|
]
|
796
779
|
: [
|
797
780
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ENUM_PROPERTY,
|
798
781
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY,
|
799
782
|
],
|
800
|
-
drop: (
|
801
|
-
item: QueryBuilderExplorerTreeDragSource,
|
802
|
-
monitor: DropTargetMonitor,
|
803
|
-
): void => {
|
783
|
+
drop: (item, monitor): void => {
|
804
784
|
if (!monitor.didDrop()) {
|
805
785
|
handleDrop(item, monitor.getItemType() as string);
|
806
786
|
} // prevent drop event propagation to accomondate for nested DnD
|
807
787
|
},
|
808
|
-
collect: (monitor)
|
809
|
-
|
788
|
+
collect: (monitor) => ({
|
789
|
+
isDragOver: monitor.isOver({ shallow: true }),
|
810
790
|
}),
|
811
791
|
}),
|
812
792
|
[handleDrop],
|
@@ -887,23 +867,29 @@ export const QueryBuilderFilterPanel = observer(
|
|
887
867
|
</button>
|
888
868
|
</div>
|
889
869
|
</div>
|
890
|
-
<div
|
891
|
-
|
892
|
-
|
893
|
-
|
894
|
-
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
902
|
-
|
903
|
-
|
904
|
-
|
905
|
-
|
906
|
-
|
870
|
+
<div className="panel__content query-builder__filter__content">
|
871
|
+
<PanelDropZone
|
872
|
+
isDragOver={isDragOver}
|
873
|
+
dropTargetConnector={dropTargetConnector}
|
874
|
+
>
|
875
|
+
{filterState.isEmpty && (
|
876
|
+
<BlankPanelPlaceholder
|
877
|
+
text="Add a filter condition"
|
878
|
+
tooltipText="Drag and drop properties here"
|
879
|
+
/>
|
880
|
+
)}
|
881
|
+
{!filterState.isEmpty && (
|
882
|
+
<>
|
883
|
+
<DragPreviewLayer
|
884
|
+
labelGetter={(
|
885
|
+
item: QueryBuilderFilterConditionDragSource,
|
886
|
+
): string => item.node.dragPreviewLabel}
|
887
|
+
types={Object.values(QUERY_BUILDER_FILTER_DND_TYPE)}
|
888
|
+
/>
|
889
|
+
<QueryBuilderFilterTree queryBuilderState={queryBuilderState} />
|
890
|
+
</>
|
891
|
+
)}
|
892
|
+
</PanelDropZone>
|
907
893
|
</div>
|
908
894
|
</div>
|
909
895
|
);
|