@finos/legend-application-query 5.1.0 → 5.2.1
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 +17 -1
- package/lib/application/LegendQueryApplicationConfig.d.ts.map +1 -1
- package/lib/application/LegendQueryApplicationConfig.js +23 -1
- package/lib/application/LegendQueryApplicationConfig.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 +28 -58
- 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 -34
- package/lib/components/QueryBuilderParameterPanel.js.map +1 -1
- package/lib/components/QueryBuilderPostFilterPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderPostFilterPanel.js +33 -58
- package/lib/components/QueryBuilderPostFilterPanel.js.map +1 -1
- package/lib/components/QueryBuilderProjectionPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderProjectionPanel.js +47 -67
- 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 -20
- package/lib/components/QueryBuilderResultPanel.js.map +1 -1
- package/lib/components/QueryBuilderSetupPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderSetupPanel.js +10 -11
- 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/index.css +2 -2
- package/lib/index.css.map +1 -1
- package/lib/package.json +10 -9
- 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 +6 -0
- package/lib/stores/QueryBuilderFetchStructureState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderFetchStructureState.js +8 -0
- package/lib/stores/QueryBuilderFetchStructureState.js.map +1 -1
- package/lib/stores/QueryBuilderFilterState.d.ts +4 -9
- package/lib/stores/QueryBuilderFilterState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderFilterState.js +6 -11
- 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/QueryBuilderPostFilterState.d.ts +4 -4
- package/lib/stores/QueryBuilderPostFilterState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderPostFilterState.js +6 -6
- package/lib/stores/QueryBuilderPostFilterState.js.map +1 -1
- package/lib/stores/QueryBuilderProjectionState.d.ts +2 -7
- package/lib/stores/QueryBuilderProjectionState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderProjectionState.js +5 -17
- 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 +6 -1
- package/lib/stores/QueryBuilderState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderState.js +9 -2
- package/lib/stores/QueryBuilderState.js.map +1 -1
- 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.map +1 -1
- package/lib/stores/QueryEditorStore.js +14 -3
- package/lib/stores/QueryEditorStore.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/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 +17 -16
- package/src/application/LegendQueryApplicationConfig.ts +35 -1
- package/src/components/QueryBuilder.tsx +13 -2
- package/src/components/QueryBuilderExplorerPanel.tsx +17 -56
- package/src/components/QueryBuilderFetchStructurePanel.tsx +93 -80
- package/src/components/QueryBuilderFilterPanel.tsx +184 -225
- package/src/components/QueryBuilderFunctionsExplorerPanel.tsx +23 -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 +21 -54
- package/src/components/QueryBuilderPostFilterPanel.tsx +202 -236
- package/src/components/QueryBuilderProjectionPanel.tsx +126 -170
- 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 +71 -52
- package/src/components/QueryBuilderSetupPanel.tsx +10 -11
- package/src/components/QueryBuilderUnsupportedQueryEditor.tsx +4 -2
- package/src/components/QueryEditor.tsx +39 -1
- package/src/stores/QueryBuilderExplorerState.ts +5 -0
- package/src/stores/QueryBuilderFetchStructureState.ts +9 -0
- package/src/stores/QueryBuilderFilterState.ts +7 -12
- package/src/stores/QueryBuilderGraphFetchTreeState.ts +14 -8
- package/src/stores/QueryBuilderLambdaProcessor.ts +8 -0
- package/src/stores/QueryBuilderPostFilterState.ts +7 -7
- package/src/stores/QueryBuilderProjectionState.ts +7 -18
- package/src/stores/QueryBuilderSetupState.ts +1 -1
- package/src/stores/QueryBuilderState.ts +10 -2
- package/src/stores/QueryBuilderValueSpecificationBuilderHelper.ts +9 -7
- package/src/stores/QueryEditorStore.ts +19 -3
- package/src/stores/QueryFunctionsExplorerState.ts +1 -11
- package/src/stores/QueryParametersState.ts +1 -3
- 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 +1 -0
@@ -14,14 +14,7 @@
|
|
14
14
|
* limitations under the License.
|
15
15
|
*/
|
16
16
|
|
17
|
-
import {
|
18
|
-
useEffect,
|
19
|
-
useRef,
|
20
|
-
useState,
|
21
|
-
useCallback,
|
22
|
-
forwardRef,
|
23
|
-
useMemo,
|
24
|
-
} from 'react';
|
17
|
+
import { useRef, useState, useCallback, forwardRef, useMemo } from 'react';
|
25
18
|
import { observer } from 'mobx-react-lite';
|
26
19
|
import {
|
27
20
|
type TreeNodeContainerProps,
|
@@ -45,6 +38,10 @@ import {
|
|
45
38
|
ChevronRightIcon,
|
46
39
|
PlusCircleIcon,
|
47
40
|
TimesIcon,
|
41
|
+
PanelDropZone,
|
42
|
+
DragPreviewLayer,
|
43
|
+
PanelEntryDropZonePlaceholder,
|
44
|
+
useDragPreviewLayer,
|
48
45
|
} from '@finos/legend-art';
|
49
46
|
import {
|
50
47
|
type QueryBuilderFilterConditionDragSource,
|
@@ -57,13 +54,7 @@ import {
|
|
57
54
|
QueryBuilderFilterTreeBlankConditionNodeData,
|
58
55
|
QueryBuilderFilterTreeGroupNodeData,
|
59
56
|
} from '../stores/QueryBuilderFilterState.js';
|
60
|
-
import {
|
61
|
-
type DropTargetMonitor,
|
62
|
-
useDragLayer,
|
63
|
-
useDrag,
|
64
|
-
useDrop,
|
65
|
-
} from 'react-dnd';
|
66
|
-
import { getEmptyImage } from 'react-dnd-html5-backend';
|
57
|
+
import { useDrag, useDrop } from 'react-dnd';
|
67
58
|
import {
|
68
59
|
type QueryBuilderExplorerTreeDragSource,
|
69
60
|
type QueryBuilderExplorerTreePropertyNodeData,
|
@@ -84,7 +75,7 @@ import {
|
|
84
75
|
} from '@finos/legend-application';
|
85
76
|
import {
|
86
77
|
type QueryBuilderParameterDragSource,
|
87
|
-
|
78
|
+
QUERY_BUILDER_PARAMETER_DND_TYPE,
|
88
79
|
} from '../stores/QueryParametersState.js';
|
89
80
|
import {
|
90
81
|
isTypeCompatibleWithConditionValueType,
|
@@ -94,54 +85,15 @@ import type { ValueSpecification } from '@finos/legend-graph';
|
|
94
85
|
import {
|
95
86
|
type QueryBuilderProjectionColumnDragSource,
|
96
87
|
QueryBuilderSimpleProjectionColumnState,
|
97
|
-
|
88
|
+
QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE,
|
98
89
|
} from '../stores/QueryBuilderProjectionState.js';
|
99
90
|
|
100
|
-
const FilterConditionDragLayer: React.FC = () => {
|
101
|
-
const { itemType, item, isDragging, currentPosition } = useDragLayer(
|
102
|
-
(monitor) => ({
|
103
|
-
itemType: monitor.getItemType() as QUERY_BUILDER_FILTER_DND_TYPE,
|
104
|
-
item: monitor.getItem<QueryBuilderFilterConditionDragSource | null>(),
|
105
|
-
isDragging: monitor.isDragging(),
|
106
|
-
initialOffset: monitor.getInitialSourceClientOffset(),
|
107
|
-
currentPosition: monitor.getClientOffset(),
|
108
|
-
}),
|
109
|
-
);
|
110
|
-
|
111
|
-
if (
|
112
|
-
!isDragging ||
|
113
|
-
!item ||
|
114
|
-
!Object.values(QUERY_BUILDER_FILTER_DND_TYPE).includes(itemType)
|
115
|
-
) {
|
116
|
-
return null;
|
117
|
-
}
|
118
|
-
return (
|
119
|
-
<div className="query-builder-filter-tree__drag-preview-layer">
|
120
|
-
<div
|
121
|
-
className="query-builder-filter-tree__drag-preview"
|
122
|
-
// added some offset so the mouse doesn't overlap the label too much
|
123
|
-
style={
|
124
|
-
!currentPosition
|
125
|
-
? { display: 'none' }
|
126
|
-
: {
|
127
|
-
transform: `translate(${currentPosition.x + 20}px, ${
|
128
|
-
currentPosition.y + 10
|
129
|
-
}px)`,
|
130
|
-
}
|
131
|
-
}
|
132
|
-
>
|
133
|
-
{item.node.dragLayerLabel}
|
134
|
-
</div>
|
135
|
-
</div>
|
136
|
-
);
|
137
|
-
};
|
138
|
-
|
139
91
|
const QueryBuilderFilterGroupConditionEditor = observer(
|
140
92
|
(props: {
|
141
93
|
node: QueryBuilderFilterTreeGroupNodeData;
|
142
|
-
|
94
|
+
isDragOver: boolean;
|
143
95
|
}) => {
|
144
|
-
const { node,
|
96
|
+
const { node, isDragOver } = props;
|
145
97
|
const switchOperation: React.MouseEventHandler<HTMLDivElement> = (
|
146
98
|
event,
|
147
99
|
): void => {
|
@@ -153,29 +105,30 @@ const QueryBuilderFilterGroupConditionEditor = observer(
|
|
153
105
|
);
|
154
106
|
};
|
155
107
|
return (
|
156
|
-
<div className="query-builder-filter-tree__node__label__content
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
)}
|
162
|
-
<div
|
163
|
-
className={clsx('query-builder-filter-tree__group-node', {
|
164
|
-
'query-builder-filter-tree__group-node--and':
|
165
|
-
node.groupOperation === QUERY_BUILDER_GROUP_OPERATION.AND,
|
166
|
-
'query-builder-filter-tree__group-node--or':
|
167
|
-
node.groupOperation === QUERY_BUILDER_GROUP_OPERATION.OR,
|
168
|
-
})}
|
169
|
-
title="Switch Operation"
|
170
|
-
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"
|
171
113
|
>
|
172
|
-
<div
|
173
|
-
{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>
|
174
130
|
</div>
|
175
|
-
|
176
|
-
<FilledTriangleIcon />
|
177
|
-
</button>
|
178
|
-
</div>
|
131
|
+
</PanelEntryDropZonePlaceholder>
|
179
132
|
</div>
|
180
133
|
);
|
181
134
|
},
|
@@ -184,9 +137,9 @@ const QueryBuilderFilterGroupConditionEditor = observer(
|
|
184
137
|
const QueryBuilderFilterConditionEditor = observer(
|
185
138
|
(props: {
|
186
139
|
node: QueryBuilderFilterTreeConditionNodeData;
|
187
|
-
|
140
|
+
isDragOver: boolean;
|
188
141
|
}) => {
|
189
|
-
const { node,
|
142
|
+
const { node, isDragOver } = props;
|
190
143
|
const graph =
|
191
144
|
node.condition.filterState.queryBuilderState.graphManagerState.graph;
|
192
145
|
const applicationStore = useApplicationStore();
|
@@ -228,18 +181,19 @@ const QueryBuilderFilterConditionEditor = observer(
|
|
228
181
|
},
|
229
182
|
[applicationStore, node.condition],
|
230
183
|
);
|
231
|
-
const [{ isFilterValueDragOver }, dropConnector] = useDrop
|
184
|
+
const [{ isFilterValueDragOver }, dropConnector] = useDrop<
|
185
|
+
QueryBuilderParameterDragSource,
|
186
|
+
void,
|
187
|
+
{ isFilterValueDragOver: boolean }
|
188
|
+
>(
|
232
189
|
() => ({
|
233
|
-
accept: [
|
234
|
-
drop: (
|
235
|
-
item: QueryBuilderParameterDragSource,
|
236
|
-
monitor: DropTargetMonitor,
|
237
|
-
): void => {
|
190
|
+
accept: [QUERY_BUILDER_PARAMETER_DND_TYPE],
|
191
|
+
drop: (item, monitor): void => {
|
238
192
|
if (!monitor.didDrop()) {
|
239
193
|
handleDrop(item);
|
240
|
-
}
|
194
|
+
} // prevent drop event propagation to accomondate for nested DnD
|
241
195
|
},
|
242
|
-
collect: (monitor)
|
196
|
+
collect: (monitor) => ({
|
243
197
|
isFilterValueDragOver: monitor.isOver({ shallow: true }),
|
244
198
|
}),
|
245
199
|
}),
|
@@ -272,76 +226,78 @@ const QueryBuilderFilterConditionEditor = observer(
|
|
272
226
|
};
|
273
227
|
|
274
228
|
return (
|
275
|
-
<div className="query-builder-filter-tree__node__label__content
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
/>
|
287
|
-
</div>
|
288
|
-
<DropdownMenu
|
289
|
-
className="query-builder-filter-tree__condition-node__operator"
|
290
|
-
content={
|
291
|
-
<MenuContent>
|
292
|
-
{node.condition.operators.map((op) => (
|
293
|
-
<MenuContentItem
|
294
|
-
key={op.uuid}
|
295
|
-
className="query-builder-filter-tree__condition-node__operator__dropdown__option"
|
296
|
-
onClick={changeOperator(op)}
|
297
|
-
>
|
298
|
-
{op.getLabel(node.condition)}
|
299
|
-
</MenuContentItem>
|
300
|
-
))}
|
301
|
-
</MenuContent>
|
302
|
-
}
|
303
|
-
menuProps={{
|
304
|
-
anchorOrigin: { vertical: 'bottom', horizontal: 'left' },
|
305
|
-
transformOrigin: { vertical: 'top', horizontal: 'left' },
|
306
|
-
elevation: 7,
|
307
|
-
}}
|
308
|
-
>
|
309
|
-
<div className="query-builder-filter-tree__condition-node__operator__label">
|
310
|
-
{node.condition.operator.getLabel(node.condition)}
|
311
|
-
</div>
|
312
|
-
<button
|
313
|
-
className="query-builder-filter-tree__condition-node__operator__dropdown__trigger"
|
314
|
-
tabIndex={-1}
|
315
|
-
title="Choose Operator..."
|
316
|
-
>
|
317
|
-
<CaretDownIcon />
|
318
|
-
</button>
|
319
|
-
</DropdownMenu>
|
320
|
-
{node.condition.value && (
|
321
|
-
<div
|
322
|
-
ref={dropConnector}
|
323
|
-
className="query-builder-filter-tree__condition-node__value dnd__overlay__container"
|
324
|
-
>
|
325
|
-
{isFilterValueDragOver && (
|
326
|
-
<div className="query-builder-filter-tree__node__dnd__overlay">
|
327
|
-
Change Filter Value
|
328
|
-
</div>
|
329
|
-
)}
|
330
|
-
<BasicValueSpecificationEditor
|
331
|
-
valueSpecification={node.condition.value}
|
332
|
-
setValueSpecification={changeValueSpecification}
|
333
|
-
graph={graph}
|
334
|
-
typeCheckOption={{
|
335
|
-
expectedType:
|
336
|
-
node.condition.propertyExpressionState.propertyExpression
|
337
|
-
.func.genericType.value.rawType,
|
338
|
-
}}
|
339
|
-
resetValue={resetNode}
|
340
|
-
selectorConfig={selectorConfig}
|
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}
|
341
240
|
/>
|
342
241
|
</div>
|
343
|
-
|
344
|
-
|
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>
|
345
301
|
</div>
|
346
302
|
);
|
347
303
|
},
|
@@ -350,17 +306,18 @@ const QueryBuilderFilterConditionEditor = observer(
|
|
350
306
|
const QueryBuilderFilterBlankConditionEditor = observer(
|
351
307
|
(props: {
|
352
308
|
node: QueryBuilderFilterTreeBlankConditionNodeData;
|
353
|
-
|
309
|
+
isDragOver: boolean;
|
354
310
|
}) => {
|
355
|
-
const {
|
311
|
+
const { isDragOver } = props;
|
356
312
|
return (
|
357
|
-
<div className="query-builder-filter-tree__node__label__content
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
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>
|
364
321
|
</div>
|
365
322
|
);
|
366
323
|
},
|
@@ -495,50 +452,45 @@ const QueryBuilderFilterTreeNodeContainer = observer(
|
|
495
452
|
},
|
496
453
|
[applicationStore, filterState, node],
|
497
454
|
);
|
498
|
-
const [{
|
455
|
+
const [{ isDragOver }, dropConnector] = useDrop<
|
456
|
+
QueryBuilderFilterConditionDragSource,
|
457
|
+
void,
|
458
|
+
{ isDragOver: boolean }
|
459
|
+
>(
|
499
460
|
() => ({
|
500
461
|
accept: [
|
501
462
|
...Object.values(QUERY_BUILDER_FILTER_DND_TYPE),
|
502
463
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ENUM_PROPERTY,
|
503
464
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY,
|
504
465
|
],
|
505
|
-
drop: (
|
506
|
-
item: QueryBuilderFilterConditionDragSource,
|
507
|
-
monitor: DropTargetMonitor,
|
508
|
-
): void => {
|
466
|
+
drop: (item, monitor): void => {
|
509
467
|
if (!monitor.didDrop()) {
|
510
468
|
handleDrop(item, monitor.getItemType() as string);
|
511
469
|
} // prevent drop event propagation to accomondate for nested DnD
|
512
470
|
},
|
513
|
-
|
514
|
-
|
515
|
-
// // prevent dropping inside my direct ancestor
|
516
|
-
// return true;
|
517
|
-
// },
|
518
|
-
collect: (monitor): { isPropertyDragOver: boolean } => ({
|
519
|
-
isPropertyDragOver: monitor.isOver({ shallow: true }),
|
471
|
+
collect: (monitor) => ({
|
472
|
+
isDragOver: monitor.isOver({ shallow: true }),
|
520
473
|
}),
|
521
474
|
}),
|
522
475
|
[handleDrop],
|
523
476
|
);
|
524
|
-
const [, dragConnector, dragPreviewConnector] =
|
525
|
-
(
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
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
|
+
);
|
537
491
|
dragConnector(dropConnector(ref));
|
538
|
-
|
539
|
-
|
540
|
-
dragPreviewConnector(getEmptyImage(), { captureDraggingState: true });
|
541
|
-
}, [dragPreviewConnector]);
|
492
|
+
useDragPreviewLayer(dragPreviewConnector);
|
493
|
+
|
542
494
|
// context menu
|
543
495
|
const onContextMenuOpen = (): void => setIsSelectedFromContextMenu(true);
|
544
496
|
const onContextMenuClose = (): void => setIsSelectedFromContextMenu(false);
|
@@ -597,19 +549,19 @@ const QueryBuilderFilterTreeNodeContainer = observer(
|
|
597
549
|
{node instanceof QueryBuilderFilterTreeGroupNodeData && (
|
598
550
|
<QueryBuilderFilterGroupConditionEditor
|
599
551
|
node={node}
|
600
|
-
|
552
|
+
isDragOver={isDragOver}
|
601
553
|
/>
|
602
554
|
)}
|
603
555
|
{node instanceof QueryBuilderFilterTreeConditionNodeData && (
|
604
556
|
<QueryBuilderFilterConditionEditor
|
605
557
|
node={node}
|
606
|
-
|
558
|
+
isDragOver={isDragOver}
|
607
559
|
/>
|
608
560
|
)}
|
609
561
|
{node instanceof QueryBuilderFilterTreeBlankConditionNodeData && (
|
610
562
|
<QueryBuilderFilterBlankConditionEditor
|
611
563
|
node={node}
|
612
|
-
|
564
|
+
isDragOver={isDragOver}
|
613
565
|
/>
|
614
566
|
)}
|
615
567
|
</div>
|
@@ -767,7 +719,7 @@ export const QueryBuilderFilterPanel = observer(
|
|
767
719
|
let filterConditionState: FilterConditionState;
|
768
720
|
try {
|
769
721
|
let propertyExpression;
|
770
|
-
if (type ===
|
722
|
+
if (type === QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE) {
|
771
723
|
if (
|
772
724
|
(item as QueryBuilderProjectionColumnDragSource)
|
773
725
|
.columnState instanceof QueryBuilderSimpleProjectionColumnState
|
@@ -812,28 +764,29 @@ export const QueryBuilderFilterPanel = observer(
|
|
812
764
|
},
|
813
765
|
[applicationStore, filterState],
|
814
766
|
);
|
815
|
-
const [{
|
767
|
+
const [{ isDragOver }, dropTargetConnector] = useDrop<
|
768
|
+
QueryBuilderExplorerTreeDragSource,
|
769
|
+
void,
|
770
|
+
{ isDragOver: boolean }
|
771
|
+
>(
|
816
772
|
() => ({
|
817
|
-
accept:
|
773
|
+
accept: queryBuilderState.mode.isDnDProjectionToFilterSupported
|
818
774
|
? [
|
819
775
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ENUM_PROPERTY,
|
820
776
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY,
|
821
|
-
|
777
|
+
QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE,
|
822
778
|
]
|
823
779
|
: [
|
824
780
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ENUM_PROPERTY,
|
825
781
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY,
|
826
782
|
],
|
827
|
-
drop: (
|
828
|
-
item: QueryBuilderExplorerTreeDragSource,
|
829
|
-
monitor: DropTargetMonitor,
|
830
|
-
): void => {
|
783
|
+
drop: (item, monitor): void => {
|
831
784
|
if (!monitor.didDrop()) {
|
832
785
|
handleDrop(item, monitor.getItemType() as string);
|
833
786
|
} // prevent drop event propagation to accomondate for nested DnD
|
834
787
|
},
|
835
|
-
collect: (monitor)
|
836
|
-
|
788
|
+
collect: (monitor) => ({
|
789
|
+
isDragOver: monitor.isOver({ shallow: true }),
|
837
790
|
}),
|
838
791
|
}),
|
839
792
|
[handleDrop],
|
@@ -914,23 +867,29 @@ export const QueryBuilderFilterPanel = observer(
|
|
914
867
|
</button>
|
915
868
|
</div>
|
916
869
|
</div>
|
917
|
-
<div
|
918
|
-
|
919
|
-
|
920
|
-
|
921
|
-
|
922
|
-
|
923
|
-
|
924
|
-
|
925
|
-
|
926
|
-
|
927
|
-
|
928
|
-
|
929
|
-
|
930
|
-
|
931
|
-
|
932
|
-
|
933
|
-
|
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>
|
934
893
|
</div>
|
935
894
|
</div>
|
936
895
|
);
|