@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
@@ -47,6 +47,10 @@ import {
|
|
47
47
|
ToggleIcon,
|
48
48
|
HashtagIcon,
|
49
49
|
ClockIcon,
|
50
|
+
PanelDropZone,
|
51
|
+
DragPreviewLayer,
|
52
|
+
PanelEntryDropZonePlaceholder,
|
53
|
+
useDragPreviewLayer,
|
50
54
|
} from '@finos/legend-art';
|
51
55
|
import {
|
52
56
|
type Type,
|
@@ -61,17 +65,12 @@ import {
|
|
61
65
|
assertErrorThrown,
|
62
66
|
guaranteeNonNullable,
|
63
67
|
returnUndefOnError,
|
68
|
+
debounce,
|
64
69
|
} from '@finos/legend-shared';
|
65
70
|
import { flowResult } from 'mobx';
|
66
71
|
import { observer } from 'mobx-react-lite';
|
67
|
-
import { forwardRef, useCallback,
|
68
|
-
import {
|
69
|
-
type DropTargetMonitor,
|
70
|
-
useDragLayer,
|
71
|
-
useDrop,
|
72
|
-
useDrag,
|
73
|
-
} from 'react-dnd';
|
74
|
-
import { getEmptyImage } from 'react-dnd-html5-backend';
|
72
|
+
import { forwardRef, useCallback, useMemo, useRef, useState } from 'react';
|
73
|
+
import { useDrop, useDrag } from 'react-dnd';
|
75
74
|
import { getColumnMultiplicity } from '../stores/postFilterOperators/QueryBuilderPostFilterOperatorHelper.js';
|
76
75
|
import { QueryBuilderAggregateColumnState } from '../stores/QueryBuilderAggregationState.js';
|
77
76
|
import {
|
@@ -92,55 +91,16 @@ import {
|
|
92
91
|
import {
|
93
92
|
type QueryBuilderProjectionColumnState,
|
94
93
|
type QueryBuilderProjectionColumnDragSource,
|
95
|
-
|
94
|
+
QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE,
|
96
95
|
QueryBuilderDerivationProjectionColumnState,
|
97
96
|
} from '../stores/QueryBuilderProjectionState.js';
|
98
97
|
import type { QueryBuilderState } from '../stores/QueryBuilderState.js';
|
99
98
|
import {
|
100
99
|
type QueryBuilderParameterDragSource,
|
101
|
-
|
100
|
+
QUERY_BUILDER_PARAMETER_DND_TYPE,
|
102
101
|
} from '../stores/QueryParametersState.js';
|
103
102
|
import { QUERY_BUILDER_TEST_ID } from './QueryBuilder_TestID.js';
|
104
103
|
|
105
|
-
const PostFilterConditionDragLayer: React.FC = () => {
|
106
|
-
const { itemType, item, isDragging, currentPosition } = useDragLayer(
|
107
|
-
(monitor) => ({
|
108
|
-
itemType: monitor.getItemType() as QUERY_BUILDER_POST_FILTER_DND_TYPE,
|
109
|
-
item: monitor.getItem<QueryBuilderPostFilterConditionDragSource | null>(),
|
110
|
-
isDragging: monitor.isDragging(),
|
111
|
-
initialOffset: monitor.getInitialSourceClientOffset(),
|
112
|
-
currentPosition: monitor.getClientOffset(),
|
113
|
-
}),
|
114
|
-
);
|
115
|
-
|
116
|
-
if (
|
117
|
-
!isDragging ||
|
118
|
-
!item ||
|
119
|
-
!Object.values(QUERY_BUILDER_POST_FILTER_DND_TYPE).includes(itemType)
|
120
|
-
) {
|
121
|
-
return null;
|
122
|
-
}
|
123
|
-
return (
|
124
|
-
<div className="query-builder-post-filter-tree__drag-preview-layer">
|
125
|
-
<div
|
126
|
-
className="query-builder-post-filter-tree__drag-preview"
|
127
|
-
// added some offset so the mouse doesn't overlap the label too much
|
128
|
-
style={
|
129
|
-
!currentPosition
|
130
|
-
? { display: 'none' }
|
131
|
-
: {
|
132
|
-
transform: `translate(${currentPosition.x + 20}px, ${
|
133
|
-
currentPosition.y + 10
|
134
|
-
}px)`,
|
135
|
-
}
|
136
|
-
}
|
137
|
-
>
|
138
|
-
{item.node.dragLayerLabel}
|
139
|
-
</div>
|
140
|
-
</div>
|
141
|
-
);
|
142
|
-
};
|
143
|
-
|
144
104
|
const QueryBuilderPostFilterConditionContextMenu = observer(
|
145
105
|
forwardRef<
|
146
106
|
HTMLDivElement,
|
@@ -195,9 +155,9 @@ const QueryBuilderPostFilterConditionContextMenu = observer(
|
|
195
155
|
const QueryBuilderPostFilterGroupConditionEditor = observer(
|
196
156
|
(props: {
|
197
157
|
node: QueryBuilderPostFilterTreeGroupNodeData;
|
198
|
-
|
158
|
+
isDragOver: boolean;
|
199
159
|
}) => {
|
200
|
-
const { node,
|
160
|
+
const { node, isDragOver } = props;
|
201
161
|
const switchOperation: React.MouseEventHandler<HTMLDivElement> = (
|
202
162
|
event,
|
203
163
|
): void => {
|
@@ -209,29 +169,30 @@ const QueryBuilderPostFilterGroupConditionEditor = observer(
|
|
209
169
|
);
|
210
170
|
};
|
211
171
|
return (
|
212
|
-
<div className="query-builder-post-filter-tree__node__label__content
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
)}
|
218
|
-
<div
|
219
|
-
className={clsx('query-builder-post-filter-tree__group-node', {
|
220
|
-
'query-builder-post-filter-tree__group-node--and':
|
221
|
-
node.groupOperation === QUERY_BUILDER_GROUP_OPERATION.AND,
|
222
|
-
'query-builder-post-filter-tree__group-node--or':
|
223
|
-
node.groupOperation === QUERY_BUILDER_GROUP_OPERATION.OR,
|
224
|
-
})}
|
225
|
-
title="Switch Operation"
|
226
|
-
onClick={switchOperation}
|
172
|
+
<div className="query-builder-post-filter-tree__node__label__content">
|
173
|
+
<PanelEntryDropZonePlaceholder
|
174
|
+
showPlaceholder={isDragOver}
|
175
|
+
label="Add to Logical Group"
|
176
|
+
className="query-builder__dnd__placeholder"
|
227
177
|
>
|
228
|
-
<div
|
229
|
-
{node
|
178
|
+
<div
|
179
|
+
className={clsx('query-builder-post-filter-tree__group-node', {
|
180
|
+
'query-builder-post-filter-tree__group-node--and':
|
181
|
+
node.groupOperation === QUERY_BUILDER_GROUP_OPERATION.AND,
|
182
|
+
'query-builder-post-filter-tree__group-node--or':
|
183
|
+
node.groupOperation === QUERY_BUILDER_GROUP_OPERATION.OR,
|
184
|
+
})}
|
185
|
+
title="Switch Operation"
|
186
|
+
onClick={switchOperation}
|
187
|
+
>
|
188
|
+
<div className="query-builder-post-filter-tree__group-node__label">
|
189
|
+
{node.groupOperation}
|
190
|
+
</div>
|
191
|
+
<button className="query-builder-post-filter-tree__group-node__action">
|
192
|
+
<FilledTriangleIcon />
|
193
|
+
</button>
|
230
194
|
</div>
|
231
|
-
|
232
|
-
<FilledTriangleIcon />
|
233
|
-
</button>
|
234
|
-
</div>
|
195
|
+
</PanelEntryDropZonePlaceholder>
|
235
196
|
</div>
|
236
197
|
);
|
237
198
|
},
|
@@ -336,22 +297,23 @@ export const QueryBuilderColumnBadge = observer(
|
|
336
297
|
onColumnChange(item.columnState),
|
337
298
|
[onColumnChange],
|
338
299
|
);
|
339
|
-
const [{
|
300
|
+
const [{ isDragOver }, dropConnector] = useDrop<
|
301
|
+
QueryBuilderProjectionColumnDragSource,
|
302
|
+
void,
|
303
|
+
{ isDragOver: boolean }
|
304
|
+
>(
|
340
305
|
() => ({
|
341
|
-
accept: [
|
342
|
-
drop: (
|
343
|
-
item: QueryBuilderProjectionColumnDragSource,
|
344
|
-
monitor: DropTargetMonitor,
|
345
|
-
): void => {
|
306
|
+
accept: [QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE],
|
307
|
+
drop: (item, monitor): void => {
|
346
308
|
if (!monitor.didDrop()) {
|
347
309
|
handleDrop(item).catch(
|
348
310
|
postFilterConditionState.postFilterState.queryBuilderState
|
349
311
|
.applicationStore.alertUnhandledError,
|
350
312
|
);
|
351
|
-
}
|
313
|
+
} // prevent drop event propagation to accomondate for nested DnD
|
352
314
|
},
|
353
|
-
collect: (monitor)
|
354
|
-
|
315
|
+
collect: (monitor) => ({
|
316
|
+
isDragOver: monitor.isOver({ shallow: true }),
|
355
317
|
}),
|
356
318
|
}),
|
357
319
|
[handleDrop],
|
@@ -359,12 +321,11 @@ export const QueryBuilderColumnBadge = observer(
|
|
359
321
|
|
360
322
|
return (
|
361
323
|
<div ref={dropConnector} className="query-builder-column-badge">
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
{!isPropertyDragOver && (
|
324
|
+
<PanelEntryDropZonePlaceholder
|
325
|
+
showPlaceholder={isDragOver}
|
326
|
+
label="Change Property"
|
327
|
+
className="query-builder__dnd__placeholder"
|
328
|
+
>
|
368
329
|
<div className="query-builder-column-badge__content">
|
369
330
|
{type && (
|
370
331
|
<div
|
@@ -395,7 +356,7 @@ export const QueryBuilderColumnBadge = observer(
|
|
395
356
|
</div>
|
396
357
|
</QueryBuilderColumnInfoTooltip>
|
397
358
|
</div>
|
398
|
-
|
359
|
+
</PanelEntryDropZonePlaceholder>
|
399
360
|
</div>
|
400
361
|
);
|
401
362
|
},
|
@@ -403,9 +364,9 @@ export const QueryBuilderColumnBadge = observer(
|
|
403
364
|
const QueryBuilderPostFilterConditionEditor = observer(
|
404
365
|
(props: {
|
405
366
|
node: QueryBuilderPostFilterTreeConditionNodeData;
|
406
|
-
|
367
|
+
isDragOver: boolean;
|
407
368
|
}) => {
|
408
|
-
const { node,
|
369
|
+
const { node, isDragOver } = props;
|
409
370
|
const graph =
|
410
371
|
node.condition.postFilterState.queryBuilderState.graphManagerState.graph;
|
411
372
|
const applicationStore = useApplicationStore();
|
@@ -444,18 +405,19 @@ const QueryBuilderPostFilterConditionEditor = observer(
|
|
444
405
|
},
|
445
406
|
[applicationStore, node.condition],
|
446
407
|
);
|
447
|
-
const [{ isFilterValueDragOver }, dropConnector] = useDrop
|
408
|
+
const [{ isFilterValueDragOver }, dropConnector] = useDrop<
|
409
|
+
QueryBuilderParameterDragSource,
|
410
|
+
void,
|
411
|
+
{ isFilterValueDragOver: boolean }
|
412
|
+
>(
|
448
413
|
() => ({
|
449
|
-
accept: [
|
450
|
-
drop: (
|
451
|
-
item: QueryBuilderParameterDragSource,
|
452
|
-
monitor: DropTargetMonitor,
|
453
|
-
): void => {
|
414
|
+
accept: [QUERY_BUILDER_PARAMETER_DND_TYPE],
|
415
|
+
drop: (item, monitor): void => {
|
454
416
|
if (!monitor.didDrop()) {
|
455
417
|
handleDrop(item);
|
456
|
-
}
|
418
|
+
} // prevent drop event propagation to accomondate for nested DnD
|
457
419
|
},
|
458
|
-
collect: (monitor)
|
420
|
+
collect: (monitor) => ({
|
459
421
|
isFilterValueDragOver: monitor.isOver({ shallow: true }),
|
460
422
|
}),
|
461
423
|
}),
|
@@ -466,79 +428,100 @@ const QueryBuilderPostFilterConditionEditor = observer(
|
|
466
428
|
node.condition.operator.getDefaultFilterConditionValue(node.condition),
|
467
429
|
);
|
468
430
|
};
|
431
|
+
const debouncedTypeaheadSearch = useMemo(
|
432
|
+
() =>
|
433
|
+
debounce(
|
434
|
+
(inputVal: string) => node.condition.handleTypeaheadSearch(),
|
435
|
+
1000,
|
436
|
+
),
|
437
|
+
[node],
|
438
|
+
);
|
439
|
+
const cleanUpReloadValues = (): void => {
|
440
|
+
node.condition.typeaheadSearchState.complete();
|
441
|
+
};
|
442
|
+
const changeValueSpecification = (val: ValueSpecification): void => {
|
443
|
+
node.condition.setValue(val);
|
444
|
+
};
|
445
|
+
const selectorConfig = {
|
446
|
+
values: node.condition.typeaheadSearchResults,
|
447
|
+
isLoading: node.condition.typeaheadSearchState.isInProgress,
|
448
|
+
reloadValues: debouncedTypeaheadSearch,
|
449
|
+
cleanUpReloadValues,
|
450
|
+
};
|
469
451
|
|
470
452
|
return (
|
471
|
-
<div className="query-builder-post-filter-tree__node__label__content
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
/>
|
483
|
-
</div>
|
484
|
-
<DropdownMenu
|
485
|
-
className="query-builder-post-filter-tree__condition-node__operator"
|
486
|
-
content={
|
487
|
-
<MenuContent>
|
488
|
-
{node.condition.operators.map((op) => (
|
489
|
-
<MenuContentItem
|
490
|
-
key={op.uuid}
|
491
|
-
className="query-builder-post-filter-tree__condition-node__operator__dropdown__option"
|
492
|
-
onClick={changeOperator(op)}
|
493
|
-
>
|
494
|
-
{op.getLabel()}
|
495
|
-
</MenuContentItem>
|
496
|
-
))}
|
497
|
-
</MenuContent>
|
498
|
-
}
|
499
|
-
menuProps={{
|
500
|
-
anchorOrigin: { vertical: 'bottom', horizontal: 'left' },
|
501
|
-
transformOrigin: { vertical: 'top', horizontal: 'left' },
|
502
|
-
elevation: 7,
|
503
|
-
}}
|
504
|
-
>
|
505
|
-
<div className="query-builder-post-filter-tree__condition-node__operator__label">
|
506
|
-
{node.condition.operator.getLabel()}
|
507
|
-
</div>
|
508
|
-
<button
|
509
|
-
className="query-builder-post-filter-tree__condition-node__operator__dropdown__trigger"
|
510
|
-
tabIndex={-1}
|
511
|
-
title="Choose Operator..."
|
512
|
-
>
|
513
|
-
<CaretDownIcon />
|
514
|
-
</button>
|
515
|
-
</DropdownMenu>
|
516
|
-
{node.condition.value && (
|
517
|
-
<div
|
518
|
-
ref={dropConnector}
|
519
|
-
className="query-builder-post-filter-tree__condition-node__value dnd__overlay__container"
|
520
|
-
>
|
521
|
-
{isFilterValueDragOver && (
|
522
|
-
<div className="query-builder-post-filter-tree__node__dnd__overlay">
|
523
|
-
Change Filter Value
|
524
|
-
</div>
|
525
|
-
)}
|
526
|
-
<BasicValueSpecificationEditor
|
527
|
-
valueSpecification={node.condition.value}
|
528
|
-
setValueSpecification={(val: ValueSpecification): void =>
|
529
|
-
node.condition.setValue(val)
|
530
|
-
}
|
531
|
-
graph={graph}
|
532
|
-
typeCheckOption={{
|
533
|
-
expectedType: guaranteeNonNullable(
|
534
|
-
node.condition.columnState.getReturnType(),
|
535
|
-
),
|
536
|
-
}}
|
537
|
-
resetValue={resetNode}
|
453
|
+
<div className="query-builder-post-filter-tree__node__label__content">
|
454
|
+
<PanelEntryDropZonePlaceholder
|
455
|
+
showPlaceholder={isDragOver}
|
456
|
+
label="Add New Logical Group"
|
457
|
+
className="query-builder__dnd__placeholder"
|
458
|
+
>
|
459
|
+
<div className="query-builder-post-filter-tree__condition-node">
|
460
|
+
<div className="query-builder-post-filter-tree__condition-node__property">
|
461
|
+
<QueryBuilderColumnBadge
|
462
|
+
postFilterConditionState={node.condition}
|
463
|
+
onColumnChange={changeColumn}
|
538
464
|
/>
|
539
465
|
</div>
|
540
|
-
|
541
|
-
|
466
|
+
<DropdownMenu
|
467
|
+
className="query-builder-post-filter-tree__condition-node__operator"
|
468
|
+
content={
|
469
|
+
<MenuContent>
|
470
|
+
{node.condition.operators.map((op) => (
|
471
|
+
<MenuContentItem
|
472
|
+
key={op.uuid}
|
473
|
+
className="query-builder-post-filter-tree__condition-node__operator__dropdown__option"
|
474
|
+
onClick={changeOperator(op)}
|
475
|
+
>
|
476
|
+
{op.getLabel()}
|
477
|
+
</MenuContentItem>
|
478
|
+
))}
|
479
|
+
</MenuContent>
|
480
|
+
}
|
481
|
+
menuProps={{
|
482
|
+
anchorOrigin: { vertical: 'bottom', horizontal: 'left' },
|
483
|
+
transformOrigin: { vertical: 'top', horizontal: 'left' },
|
484
|
+
elevation: 7,
|
485
|
+
}}
|
486
|
+
>
|
487
|
+
<div className="query-builder-post-filter-tree__condition-node__operator__label">
|
488
|
+
{node.condition.operator.getLabel()}
|
489
|
+
</div>
|
490
|
+
<button
|
491
|
+
className="query-builder-post-filter-tree__condition-node__operator__dropdown__trigger"
|
492
|
+
tabIndex={-1}
|
493
|
+
title="Choose Operator..."
|
494
|
+
>
|
495
|
+
<CaretDownIcon />
|
496
|
+
</button>
|
497
|
+
</DropdownMenu>
|
498
|
+
{node.condition.value && (
|
499
|
+
<div
|
500
|
+
ref={dropConnector}
|
501
|
+
className="query-builder-post-filter-tree__condition-node__value"
|
502
|
+
>
|
503
|
+
<PanelEntryDropZonePlaceholder
|
504
|
+
showPlaceholder={isFilterValueDragOver}
|
505
|
+
label="Change Filter Value"
|
506
|
+
className="query-builder__dnd__placeholder"
|
507
|
+
>
|
508
|
+
<BasicValueSpecificationEditor
|
509
|
+
valueSpecification={node.condition.value}
|
510
|
+
setValueSpecification={changeValueSpecification}
|
511
|
+
graph={graph}
|
512
|
+
typeCheckOption={{
|
513
|
+
expectedType: guaranteeNonNullable(
|
514
|
+
node.condition.columnState.getReturnType(),
|
515
|
+
),
|
516
|
+
}}
|
517
|
+
resetValue={resetNode}
|
518
|
+
selectorConfig={selectorConfig}
|
519
|
+
/>
|
520
|
+
</PanelEntryDropZonePlaceholder>
|
521
|
+
</div>
|
522
|
+
)}
|
523
|
+
</div>
|
524
|
+
</PanelEntryDropZonePlaceholder>
|
542
525
|
</div>
|
543
526
|
);
|
544
527
|
},
|
@@ -547,17 +530,20 @@ const QueryBuilderPostFilterConditionEditor = observer(
|
|
547
530
|
const QueryBuilderPostFilterBlankConditionEditor = observer(
|
548
531
|
(props: {
|
549
532
|
node: QueryBuilderPostFilterTreeBlankConditionNodeData;
|
550
|
-
|
533
|
+
isDragOver: boolean;
|
551
534
|
}) => {
|
552
|
-
const {
|
535
|
+
const { isDragOver } = props;
|
553
536
|
return (
|
554
|
-
<div className="query-builder-post-filter-tree__node__label__content
|
555
|
-
|
556
|
-
|
557
|
-
|
537
|
+
<div className="query-builder-post-filter-tree__node__label__content">
|
538
|
+
<PanelEntryDropZonePlaceholder
|
539
|
+
showPlaceholder={isDragOver}
|
540
|
+
label="Create Condition"
|
541
|
+
className="query-builder__dnd__placeholder"
|
542
|
+
>
|
543
|
+
<div className="query-builder-post-filter-tree__blank-node">
|
544
|
+
blank
|
558
545
|
</div>
|
559
|
-
|
560
|
-
<div className="query-builder-post-filter-tree__blank-node">blank</div>
|
546
|
+
</PanelEntryDropZonePlaceholder>
|
561
547
|
</div>
|
562
548
|
);
|
563
549
|
},
|
@@ -587,7 +573,7 @@ const QueryBuilderPostFilterTreeNodeContainer = observer(
|
|
587
573
|
postFilterState.removeNodeAndPruneBranch(node);
|
588
574
|
const handleDrop = useCallback(
|
589
575
|
(item: QueryBuilderPostFilterDropTarget, type: string): void => {
|
590
|
-
if (type ===
|
576
|
+
if (type === QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE) {
|
591
577
|
const columnState = (item as QueryBuilderProjectionColumnDragSource)
|
592
578
|
.columnState;
|
593
579
|
let conditionState: PostFilterConditionState;
|
@@ -642,45 +628,45 @@ const QueryBuilderPostFilterTreeNodeContainer = observer(
|
|
642
628
|
},
|
643
629
|
[applicationStore, postFilterState, node],
|
644
630
|
);
|
645
|
-
const [{
|
631
|
+
const [{ isDragOver }, dropConnector] = useDrop<
|
632
|
+
QueryBuilderPostFilterConditionDragSource,
|
633
|
+
void,
|
634
|
+
{ isDragOver: boolean }
|
635
|
+
>(
|
646
636
|
() => ({
|
647
637
|
accept: [
|
648
638
|
...Object.values(QUERY_BUILDER_POST_FILTER_DND_TYPE),
|
649
|
-
|
639
|
+
QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE,
|
650
640
|
],
|
651
|
-
drop: (
|
652
|
-
item: QueryBuilderPostFilterConditionDragSource,
|
653
|
-
monitor: DropTargetMonitor,
|
654
|
-
): void => {
|
641
|
+
drop: (item, monitor): void => {
|
655
642
|
if (!monitor.didDrop()) {
|
656
643
|
handleDrop(item, monitor.getItemType() as string);
|
657
644
|
} // prevent drop event propagation to accomondate for nested DnD
|
658
645
|
},
|
659
|
-
collect: (monitor)
|
660
|
-
|
646
|
+
collect: (monitor) => ({
|
647
|
+
isDragOver: monitor.isOver({ shallow: true }),
|
661
648
|
}),
|
662
649
|
}),
|
663
650
|
[handleDrop],
|
664
651
|
);
|
665
652
|
|
666
|
-
const [, dragConnector, dragPreviewConnector] =
|
667
|
-
(
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
653
|
+
const [, dragConnector, dragPreviewConnector] =
|
654
|
+
useDrag<QueryBuilderPostFilterConditionDragSource>(
|
655
|
+
() => ({
|
656
|
+
type:
|
657
|
+
node instanceof QueryBuilderPostFilterTreeGroupNodeData
|
658
|
+
? QUERY_BUILDER_POST_FILTER_DND_TYPE.GROUP_CONDITION
|
659
|
+
: node instanceof QueryBuilderPostFilterTreeConditionNodeData
|
660
|
+
? QUERY_BUILDER_POST_FILTER_DND_TYPE.CONDITION
|
661
|
+
: QUERY_BUILDER_POST_FILTER_DND_TYPE.BLANK_CONDITION,
|
662
|
+
item: () => ({ node }),
|
663
|
+
end: (): void => postFilterState.setRearrangingConditions(false),
|
664
|
+
}),
|
665
|
+
[node, postFilterState],
|
666
|
+
);
|
679
667
|
dragConnector(dropConnector(ref));
|
680
|
-
|
681
|
-
|
682
|
-
dragPreviewConnector(getEmptyImage(), { captureDraggingState: true });
|
683
|
-
}, [dragPreviewConnector]);
|
668
|
+
useDragPreviewLayer(dragPreviewConnector);
|
669
|
+
|
684
670
|
// context menu
|
685
671
|
const onContextMenuOpen = (): void => setIsSelectedFromContextMenu(true);
|
686
672
|
const onContextMenuClose = (): void => setIsSelectedFromContextMenu(false);
|
@@ -739,20 +725,20 @@ const QueryBuilderPostFilterTreeNodeContainer = observer(
|
|
739
725
|
{node instanceof QueryBuilderPostFilterTreeGroupNodeData && (
|
740
726
|
<QueryBuilderPostFilterGroupConditionEditor
|
741
727
|
node={node}
|
742
|
-
|
728
|
+
isDragOver={isDragOver}
|
743
729
|
/>
|
744
730
|
)}
|
745
731
|
{node instanceof QueryBuilderPostFilterTreeConditionNodeData && (
|
746
732
|
<QueryBuilderPostFilterConditionEditor
|
747
733
|
node={node}
|
748
|
-
|
734
|
+
isDragOver={isDragOver}
|
749
735
|
/>
|
750
736
|
)}
|
751
737
|
{node instanceof
|
752
738
|
QueryBuilderPostFilterTreeBlankConditionNodeData && (
|
753
739
|
<QueryBuilderPostFilterBlankConditionEditor
|
754
740
|
node={node}
|
755
|
-
|
741
|
+
isDragOver={isDragOver}
|
756
742
|
/>
|
757
743
|
)}
|
758
744
|
</div>
|
@@ -960,21 +946,22 @@ export const QueryBuilderPostFilterPanel = observer(
|
|
960
946
|
.columns,
|
961
947
|
],
|
962
948
|
);
|
963
|
-
const [{
|
949
|
+
const [{ isDragOver }, dropTargetConnector] = useDrop<
|
950
|
+
QueryBuilderProjectionColumnDragSource,
|
951
|
+
void,
|
952
|
+
{ isDragOver: boolean }
|
953
|
+
>(
|
964
954
|
() => ({
|
965
|
-
accept: [
|
966
|
-
drop: (
|
967
|
-
item: QueryBuilderProjectionColumnDragSource,
|
968
|
-
monitor: DropTargetMonitor,
|
969
|
-
): void => {
|
955
|
+
accept: [QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE],
|
956
|
+
drop: (item, monitor): void => {
|
970
957
|
if (!monitor.didDrop()) {
|
971
958
|
handleDrop(item).catch(
|
972
959
|
queryBuilderState.applicationStore.alertUnhandledError,
|
973
960
|
);
|
974
961
|
} // prevent drop event propagation to accomondate for nested DnD
|
975
962
|
},
|
976
|
-
collect: (monitor)
|
977
|
-
|
963
|
+
collect: (monitor) => ({
|
964
|
+
isDragOver: monitor.isOver({ shallow: true }),
|
978
965
|
}),
|
979
966
|
}),
|
980
967
|
[handleDrop],
|
@@ -1054,25 +1041,31 @@ export const QueryBuilderPostFilterPanel = observer(
|
|
1054
1041
|
</button>
|
1055
1042
|
</div>
|
1056
1043
|
</div>
|
1057
|
-
<div
|
1058
|
-
|
1059
|
-
|
1060
|
-
|
1061
|
-
|
1062
|
-
|
1063
|
-
|
1064
|
-
|
1065
|
-
|
1066
|
-
/>
|
1067
|
-
)}
|
1068
|
-
{!postFilterState.isEmpty && (
|
1069
|
-
<>
|
1070
|
-
<PostFilterConditionDragLayer />
|
1071
|
-
<QueryBuilderPostFilterTree
|
1072
|
-
queryBuilderState={queryBuilderState}
|
1044
|
+
<div className="panel__content query-builder__filter__content">
|
1045
|
+
<PanelDropZone
|
1046
|
+
isDragOver={isDragOver}
|
1047
|
+
dropTargetConnector={dropTargetConnector}
|
1048
|
+
>
|
1049
|
+
{postFilterState.isEmpty && (
|
1050
|
+
<BlankPanelPlaceholder
|
1051
|
+
text="Add a post-filter condition"
|
1052
|
+
tooltipText="Drag and drop properties here"
|
1073
1053
|
/>
|
1074
|
-
|
1075
|
-
|
1054
|
+
)}
|
1055
|
+
{!postFilterState.isEmpty && (
|
1056
|
+
<>
|
1057
|
+
<DragPreviewLayer
|
1058
|
+
labelGetter={(
|
1059
|
+
item: QueryBuilderPostFilterConditionDragSource,
|
1060
|
+
): string => item.node.dragPreviewLabel}
|
1061
|
+
types={Object.values(QUERY_BUILDER_POST_FILTER_DND_TYPE)}
|
1062
|
+
/>
|
1063
|
+
<QueryBuilderPostFilterTree
|
1064
|
+
queryBuilderState={queryBuilderState}
|
1065
|
+
/>
|
1066
|
+
</>
|
1067
|
+
)}
|
1068
|
+
</PanelDropZone>
|
1076
1069
|
</div>
|
1077
1070
|
</div>
|
1078
1071
|
);
|