@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
@@ -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,
|
@@ -65,21 +69,8 @@ import {
|
|
65
69
|
} from '@finos/legend-shared';
|
66
70
|
import { flowResult } from 'mobx';
|
67
71
|
import { observer } from 'mobx-react-lite';
|
68
|
-
import {
|
69
|
-
|
70
|
-
useCallback,
|
71
|
-
useEffect,
|
72
|
-
useMemo,
|
73
|
-
useRef,
|
74
|
-
useState,
|
75
|
-
} from 'react';
|
76
|
-
import {
|
77
|
-
type DropTargetMonitor,
|
78
|
-
useDragLayer,
|
79
|
-
useDrop,
|
80
|
-
useDrag,
|
81
|
-
} from 'react-dnd';
|
82
|
-
import { getEmptyImage } from 'react-dnd-html5-backend';
|
72
|
+
import { forwardRef, useCallback, useMemo, useRef, useState } from 'react';
|
73
|
+
import { useDrop, useDrag } from 'react-dnd';
|
83
74
|
import { getColumnMultiplicity } from '../stores/postFilterOperators/QueryBuilderPostFilterOperatorHelper.js';
|
84
75
|
import { QueryBuilderAggregateColumnState } from '../stores/QueryBuilderAggregationState.js';
|
85
76
|
import {
|
@@ -100,55 +91,16 @@ import {
|
|
100
91
|
import {
|
101
92
|
type QueryBuilderProjectionColumnState,
|
102
93
|
type QueryBuilderProjectionColumnDragSource,
|
103
|
-
|
94
|
+
QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE,
|
104
95
|
QueryBuilderDerivationProjectionColumnState,
|
105
96
|
} from '../stores/QueryBuilderProjectionState.js';
|
106
97
|
import type { QueryBuilderState } from '../stores/QueryBuilderState.js';
|
107
98
|
import {
|
108
99
|
type QueryBuilderParameterDragSource,
|
109
|
-
|
100
|
+
QUERY_BUILDER_PARAMETER_DND_TYPE,
|
110
101
|
} from '../stores/QueryParametersState.js';
|
111
102
|
import { QUERY_BUILDER_TEST_ID } from './QueryBuilder_TestID.js';
|
112
103
|
|
113
|
-
const PostFilterConditionDragLayer: React.FC = () => {
|
114
|
-
const { itemType, item, isDragging, currentPosition } = useDragLayer(
|
115
|
-
(monitor) => ({
|
116
|
-
itemType: monitor.getItemType() as QUERY_BUILDER_POST_FILTER_DND_TYPE,
|
117
|
-
item: monitor.getItem<QueryBuilderPostFilterConditionDragSource | null>(),
|
118
|
-
isDragging: monitor.isDragging(),
|
119
|
-
initialOffset: monitor.getInitialSourceClientOffset(),
|
120
|
-
currentPosition: monitor.getClientOffset(),
|
121
|
-
}),
|
122
|
-
);
|
123
|
-
|
124
|
-
if (
|
125
|
-
!isDragging ||
|
126
|
-
!item ||
|
127
|
-
!Object.values(QUERY_BUILDER_POST_FILTER_DND_TYPE).includes(itemType)
|
128
|
-
) {
|
129
|
-
return null;
|
130
|
-
}
|
131
|
-
return (
|
132
|
-
<div className="query-builder-post-filter-tree__drag-preview-layer">
|
133
|
-
<div
|
134
|
-
className="query-builder-post-filter-tree__drag-preview"
|
135
|
-
// added some offset so the mouse doesn't overlap the label too much
|
136
|
-
style={
|
137
|
-
!currentPosition
|
138
|
-
? { display: 'none' }
|
139
|
-
: {
|
140
|
-
transform: `translate(${currentPosition.x + 20}px, ${
|
141
|
-
currentPosition.y + 10
|
142
|
-
}px)`,
|
143
|
-
}
|
144
|
-
}
|
145
|
-
>
|
146
|
-
{item.node.dragLayerLabel}
|
147
|
-
</div>
|
148
|
-
</div>
|
149
|
-
);
|
150
|
-
};
|
151
|
-
|
152
104
|
const QueryBuilderPostFilterConditionContextMenu = observer(
|
153
105
|
forwardRef<
|
154
106
|
HTMLDivElement,
|
@@ -203,9 +155,9 @@ const QueryBuilderPostFilterConditionContextMenu = observer(
|
|
203
155
|
const QueryBuilderPostFilterGroupConditionEditor = observer(
|
204
156
|
(props: {
|
205
157
|
node: QueryBuilderPostFilterTreeGroupNodeData;
|
206
|
-
|
158
|
+
isDragOver: boolean;
|
207
159
|
}) => {
|
208
|
-
const { node,
|
160
|
+
const { node, isDragOver } = props;
|
209
161
|
const switchOperation: React.MouseEventHandler<HTMLDivElement> = (
|
210
162
|
event,
|
211
163
|
): void => {
|
@@ -217,29 +169,30 @@ const QueryBuilderPostFilterGroupConditionEditor = observer(
|
|
217
169
|
);
|
218
170
|
};
|
219
171
|
return (
|
220
|
-
<div className="query-builder-post-filter-tree__node__label__content
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
)}
|
226
|
-
<div
|
227
|
-
className={clsx('query-builder-post-filter-tree__group-node', {
|
228
|
-
'query-builder-post-filter-tree__group-node--and':
|
229
|
-
node.groupOperation === QUERY_BUILDER_GROUP_OPERATION.AND,
|
230
|
-
'query-builder-post-filter-tree__group-node--or':
|
231
|
-
node.groupOperation === QUERY_BUILDER_GROUP_OPERATION.OR,
|
232
|
-
})}
|
233
|
-
title="Switch Operation"
|
234
|
-
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"
|
235
177
|
>
|
236
|
-
<div
|
237
|
-
{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>
|
238
194
|
</div>
|
239
|
-
|
240
|
-
<FilledTriangleIcon />
|
241
|
-
</button>
|
242
|
-
</div>
|
195
|
+
</PanelEntryDropZonePlaceholder>
|
243
196
|
</div>
|
244
197
|
);
|
245
198
|
},
|
@@ -344,22 +297,23 @@ export const QueryBuilderColumnBadge = observer(
|
|
344
297
|
onColumnChange(item.columnState),
|
345
298
|
[onColumnChange],
|
346
299
|
);
|
347
|
-
const [{
|
300
|
+
const [{ isDragOver }, dropConnector] = useDrop<
|
301
|
+
QueryBuilderProjectionColumnDragSource,
|
302
|
+
void,
|
303
|
+
{ isDragOver: boolean }
|
304
|
+
>(
|
348
305
|
() => ({
|
349
|
-
accept: [
|
350
|
-
drop: (
|
351
|
-
item: QueryBuilderProjectionColumnDragSource,
|
352
|
-
monitor: DropTargetMonitor,
|
353
|
-
): void => {
|
306
|
+
accept: [QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE],
|
307
|
+
drop: (item, monitor): void => {
|
354
308
|
if (!monitor.didDrop()) {
|
355
309
|
handleDrop(item).catch(
|
356
310
|
postFilterConditionState.postFilterState.queryBuilderState
|
357
311
|
.applicationStore.alertUnhandledError,
|
358
312
|
);
|
359
|
-
}
|
313
|
+
} // prevent drop event propagation to accomondate for nested DnD
|
360
314
|
},
|
361
|
-
collect: (monitor)
|
362
|
-
|
315
|
+
collect: (monitor) => ({
|
316
|
+
isDragOver: monitor.isOver({ shallow: true }),
|
363
317
|
}),
|
364
318
|
}),
|
365
319
|
[handleDrop],
|
@@ -367,12 +321,11 @@ export const QueryBuilderColumnBadge = observer(
|
|
367
321
|
|
368
322
|
return (
|
369
323
|
<div ref={dropConnector} className="query-builder-column-badge">
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
{!isPropertyDragOver && (
|
324
|
+
<PanelEntryDropZonePlaceholder
|
325
|
+
showPlaceholder={isDragOver}
|
326
|
+
label="Change Property"
|
327
|
+
className="query-builder__dnd__placeholder"
|
328
|
+
>
|
376
329
|
<div className="query-builder-column-badge__content">
|
377
330
|
{type && (
|
378
331
|
<div
|
@@ -403,7 +356,7 @@ export const QueryBuilderColumnBadge = observer(
|
|
403
356
|
</div>
|
404
357
|
</QueryBuilderColumnInfoTooltip>
|
405
358
|
</div>
|
406
|
-
|
359
|
+
</PanelEntryDropZonePlaceholder>
|
407
360
|
</div>
|
408
361
|
);
|
409
362
|
},
|
@@ -411,9 +364,9 @@ export const QueryBuilderColumnBadge = observer(
|
|
411
364
|
const QueryBuilderPostFilterConditionEditor = observer(
|
412
365
|
(props: {
|
413
366
|
node: QueryBuilderPostFilterTreeConditionNodeData;
|
414
|
-
|
367
|
+
isDragOver: boolean;
|
415
368
|
}) => {
|
416
|
-
const { node,
|
369
|
+
const { node, isDragOver } = props;
|
417
370
|
const graph =
|
418
371
|
node.condition.postFilterState.queryBuilderState.graphManagerState.graph;
|
419
372
|
const applicationStore = useApplicationStore();
|
@@ -452,18 +405,19 @@ const QueryBuilderPostFilterConditionEditor = observer(
|
|
452
405
|
},
|
453
406
|
[applicationStore, node.condition],
|
454
407
|
);
|
455
|
-
const [{ isFilterValueDragOver }, dropConnector] = useDrop
|
408
|
+
const [{ isFilterValueDragOver }, dropConnector] = useDrop<
|
409
|
+
QueryBuilderParameterDragSource,
|
410
|
+
void,
|
411
|
+
{ isFilterValueDragOver: boolean }
|
412
|
+
>(
|
456
413
|
() => ({
|
457
|
-
accept: [
|
458
|
-
drop: (
|
459
|
-
item: QueryBuilderParameterDragSource,
|
460
|
-
monitor: DropTargetMonitor,
|
461
|
-
): void => {
|
414
|
+
accept: [QUERY_BUILDER_PARAMETER_DND_TYPE],
|
415
|
+
drop: (item, monitor): void => {
|
462
416
|
if (!monitor.didDrop()) {
|
463
417
|
handleDrop(item);
|
464
|
-
}
|
418
|
+
} // prevent drop event propagation to accomondate for nested DnD
|
465
419
|
},
|
466
|
-
collect: (monitor)
|
420
|
+
collect: (monitor) => ({
|
467
421
|
isFilterValueDragOver: monitor.isOver({ shallow: true }),
|
468
422
|
}),
|
469
423
|
}),
|
@@ -496,76 +450,78 @@ const QueryBuilderPostFilterConditionEditor = observer(
|
|
496
450
|
};
|
497
451
|
|
498
452
|
return (
|
499
|
-
<div className="query-builder-post-filter-tree__node__label__content
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
/>
|
511
|
-
</div>
|
512
|
-
<DropdownMenu
|
513
|
-
className="query-builder-post-filter-tree__condition-node__operator"
|
514
|
-
content={
|
515
|
-
<MenuContent>
|
516
|
-
{node.condition.operators.map((op) => (
|
517
|
-
<MenuContentItem
|
518
|
-
key={op.uuid}
|
519
|
-
className="query-builder-post-filter-tree__condition-node__operator__dropdown__option"
|
520
|
-
onClick={changeOperator(op)}
|
521
|
-
>
|
522
|
-
{op.getLabel()}
|
523
|
-
</MenuContentItem>
|
524
|
-
))}
|
525
|
-
</MenuContent>
|
526
|
-
}
|
527
|
-
menuProps={{
|
528
|
-
anchorOrigin: { vertical: 'bottom', horizontal: 'left' },
|
529
|
-
transformOrigin: { vertical: 'top', horizontal: 'left' },
|
530
|
-
elevation: 7,
|
531
|
-
}}
|
532
|
-
>
|
533
|
-
<div className="query-builder-post-filter-tree__condition-node__operator__label">
|
534
|
-
{node.condition.operator.getLabel()}
|
535
|
-
</div>
|
536
|
-
<button
|
537
|
-
className="query-builder-post-filter-tree__condition-node__operator__dropdown__trigger"
|
538
|
-
tabIndex={-1}
|
539
|
-
title="Choose Operator..."
|
540
|
-
>
|
541
|
-
<CaretDownIcon />
|
542
|
-
</button>
|
543
|
-
</DropdownMenu>
|
544
|
-
{node.condition.value && (
|
545
|
-
<div
|
546
|
-
ref={dropConnector}
|
547
|
-
className="query-builder-post-filter-tree__condition-node__value dnd__overlay__container"
|
548
|
-
>
|
549
|
-
{isFilterValueDragOver && (
|
550
|
-
<div className="query-builder-post-filter-tree__node__dnd__overlay">
|
551
|
-
Change Filter Value
|
552
|
-
</div>
|
553
|
-
)}
|
554
|
-
<BasicValueSpecificationEditor
|
555
|
-
valueSpecification={node.condition.value}
|
556
|
-
setValueSpecification={changeValueSpecification}
|
557
|
-
graph={graph}
|
558
|
-
typeCheckOption={{
|
559
|
-
expectedType: guaranteeNonNullable(
|
560
|
-
node.condition.columnState.getReturnType(),
|
561
|
-
),
|
562
|
-
}}
|
563
|
-
resetValue={resetNode}
|
564
|
-
selectorConfig={selectorConfig}
|
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}
|
565
464
|
/>
|
566
465
|
</div>
|
567
|
-
|
568
|
-
|
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>
|
569
525
|
</div>
|
570
526
|
);
|
571
527
|
},
|
@@ -574,17 +530,20 @@ const QueryBuilderPostFilterConditionEditor = observer(
|
|
574
530
|
const QueryBuilderPostFilterBlankConditionEditor = observer(
|
575
531
|
(props: {
|
576
532
|
node: QueryBuilderPostFilterTreeBlankConditionNodeData;
|
577
|
-
|
533
|
+
isDragOver: boolean;
|
578
534
|
}) => {
|
579
|
-
const {
|
535
|
+
const { isDragOver } = props;
|
580
536
|
return (
|
581
|
-
<div className="query-builder-post-filter-tree__node__label__content
|
582
|
-
|
583
|
-
|
584
|
-
|
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
|
585
545
|
</div>
|
586
|
-
|
587
|
-
<div className="query-builder-post-filter-tree__blank-node">blank</div>
|
546
|
+
</PanelEntryDropZonePlaceholder>
|
588
547
|
</div>
|
589
548
|
);
|
590
549
|
},
|
@@ -614,7 +573,7 @@ const QueryBuilderPostFilterTreeNodeContainer = observer(
|
|
614
573
|
postFilterState.removeNodeAndPruneBranch(node);
|
615
574
|
const handleDrop = useCallback(
|
616
575
|
(item: QueryBuilderPostFilterDropTarget, type: string): void => {
|
617
|
-
if (type ===
|
576
|
+
if (type === QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE) {
|
618
577
|
const columnState = (item as QueryBuilderProjectionColumnDragSource)
|
619
578
|
.columnState;
|
620
579
|
let conditionState: PostFilterConditionState;
|
@@ -669,45 +628,45 @@ const QueryBuilderPostFilterTreeNodeContainer = observer(
|
|
669
628
|
},
|
670
629
|
[applicationStore, postFilterState, node],
|
671
630
|
);
|
672
|
-
const [{
|
631
|
+
const [{ isDragOver }, dropConnector] = useDrop<
|
632
|
+
QueryBuilderPostFilterConditionDragSource,
|
633
|
+
void,
|
634
|
+
{ isDragOver: boolean }
|
635
|
+
>(
|
673
636
|
() => ({
|
674
637
|
accept: [
|
675
638
|
...Object.values(QUERY_BUILDER_POST_FILTER_DND_TYPE),
|
676
|
-
|
639
|
+
QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE,
|
677
640
|
],
|
678
|
-
drop: (
|
679
|
-
item: QueryBuilderPostFilterConditionDragSource,
|
680
|
-
monitor: DropTargetMonitor,
|
681
|
-
): void => {
|
641
|
+
drop: (item, monitor): void => {
|
682
642
|
if (!monitor.didDrop()) {
|
683
643
|
handleDrop(item, monitor.getItemType() as string);
|
684
644
|
} // prevent drop event propagation to accomondate for nested DnD
|
685
645
|
},
|
686
|
-
collect: (monitor)
|
687
|
-
|
646
|
+
collect: (monitor) => ({
|
647
|
+
isDragOver: monitor.isOver({ shallow: true }),
|
688
648
|
}),
|
689
649
|
}),
|
690
650
|
[handleDrop],
|
691
651
|
);
|
692
652
|
|
693
|
-
const [, dragConnector, dragPreviewConnector] =
|
694
|
-
(
|
695
|
-
|
696
|
-
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
|
705
|
-
|
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
|
+
);
|
706
667
|
dragConnector(dropConnector(ref));
|
707
|
-
|
708
|
-
|
709
|
-
dragPreviewConnector(getEmptyImage(), { captureDraggingState: true });
|
710
|
-
}, [dragPreviewConnector]);
|
668
|
+
useDragPreviewLayer(dragPreviewConnector);
|
669
|
+
|
711
670
|
// context menu
|
712
671
|
const onContextMenuOpen = (): void => setIsSelectedFromContextMenu(true);
|
713
672
|
const onContextMenuClose = (): void => setIsSelectedFromContextMenu(false);
|
@@ -766,20 +725,20 @@ const QueryBuilderPostFilterTreeNodeContainer = observer(
|
|
766
725
|
{node instanceof QueryBuilderPostFilterTreeGroupNodeData && (
|
767
726
|
<QueryBuilderPostFilterGroupConditionEditor
|
768
727
|
node={node}
|
769
|
-
|
728
|
+
isDragOver={isDragOver}
|
770
729
|
/>
|
771
730
|
)}
|
772
731
|
{node instanceof QueryBuilderPostFilterTreeConditionNodeData && (
|
773
732
|
<QueryBuilderPostFilterConditionEditor
|
774
733
|
node={node}
|
775
|
-
|
734
|
+
isDragOver={isDragOver}
|
776
735
|
/>
|
777
736
|
)}
|
778
737
|
{node instanceof
|
779
738
|
QueryBuilderPostFilterTreeBlankConditionNodeData && (
|
780
739
|
<QueryBuilderPostFilterBlankConditionEditor
|
781
740
|
node={node}
|
782
|
-
|
741
|
+
isDragOver={isDragOver}
|
783
742
|
/>
|
784
743
|
)}
|
785
744
|
</div>
|
@@ -987,21 +946,22 @@ export const QueryBuilderPostFilterPanel = observer(
|
|
987
946
|
.columns,
|
988
947
|
],
|
989
948
|
);
|
990
|
-
const [{
|
949
|
+
const [{ isDragOver }, dropTargetConnector] = useDrop<
|
950
|
+
QueryBuilderProjectionColumnDragSource,
|
951
|
+
void,
|
952
|
+
{ isDragOver: boolean }
|
953
|
+
>(
|
991
954
|
() => ({
|
992
|
-
accept: [
|
993
|
-
drop: (
|
994
|
-
item: QueryBuilderProjectionColumnDragSource,
|
995
|
-
monitor: DropTargetMonitor,
|
996
|
-
): void => {
|
955
|
+
accept: [QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE],
|
956
|
+
drop: (item, monitor): void => {
|
997
957
|
if (!monitor.didDrop()) {
|
998
958
|
handleDrop(item).catch(
|
999
959
|
queryBuilderState.applicationStore.alertUnhandledError,
|
1000
960
|
);
|
1001
961
|
} // prevent drop event propagation to accomondate for nested DnD
|
1002
962
|
},
|
1003
|
-
collect: (monitor)
|
1004
|
-
|
963
|
+
collect: (monitor) => ({
|
964
|
+
isDragOver: monitor.isOver({ shallow: true }),
|
1005
965
|
}),
|
1006
966
|
}),
|
1007
967
|
[handleDrop],
|
@@ -1081,25 +1041,31 @@ export const QueryBuilderPostFilterPanel = observer(
|
|
1081
1041
|
</button>
|
1082
1042
|
</div>
|
1083
1043
|
</div>
|
1084
|
-
<div
|
1085
|
-
|
1086
|
-
|
1087
|
-
|
1088
|
-
|
1089
|
-
|
1090
|
-
|
1091
|
-
|
1092
|
-
|
1093
|
-
/>
|
1094
|
-
)}
|
1095
|
-
{!postFilterState.isEmpty && (
|
1096
|
-
<>
|
1097
|
-
<PostFilterConditionDragLayer />
|
1098
|
-
<QueryBuilderPostFilterTree
|
1099
|
-
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"
|
1100
1053
|
/>
|
1101
|
-
|
1102
|
-
|
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>
|
1103
1069
|
</div>
|
1104
1070
|
</div>
|
1105
1071
|
);
|