@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
@@ -28,7 +28,10 @@ import {
|
|
28
28
|
ContextMenu,
|
29
29
|
InputWithInlineValidation,
|
30
30
|
SigmaIcon,
|
31
|
-
|
31
|
+
PanelDropZone,
|
32
|
+
DragPreviewLayer,
|
33
|
+
PanelEntryDropZonePlaceholder,
|
34
|
+
useDragPreviewLayer,
|
32
35
|
} from '@finos/legend-art';
|
33
36
|
import {
|
34
37
|
type QueryBuilderExplorerTreeDragSource,
|
@@ -36,32 +39,28 @@ import {
|
|
36
39
|
buildPropertyExpressionFromExplorerTreeNodeData,
|
37
40
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE,
|
38
41
|
} from '../stores/QueryBuilderExplorerState.js';
|
39
|
-
import {
|
40
|
-
type DropTargetMonitor,
|
41
|
-
type XYCoord,
|
42
|
-
useDragLayer,
|
43
|
-
useDrag,
|
44
|
-
useDrop,
|
45
|
-
} from 'react-dnd';
|
46
|
-
import { getEmptyImage } from 'react-dnd-html5-backend';
|
42
|
+
import { type DropTargetMonitor, useDrag, useDrop } from 'react-dnd';
|
47
43
|
import {
|
48
44
|
type QueryBuilderProjectionColumnDragSource,
|
49
45
|
type QueryBuilderProjectionColumnState,
|
50
46
|
QueryBuilderDerivationProjectionColumnState,
|
51
47
|
QueryBuilderSimpleProjectionColumnState,
|
52
|
-
|
48
|
+
QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE,
|
53
49
|
} from '../stores/QueryBuilderProjectionState.js';
|
54
50
|
import { QueryBuilderPropertyExpressionBadge } from './QueryBuilderPropertyExpressionEditor.js';
|
55
51
|
import type { QueryBuilderState } from '../stores/QueryBuilderState.js';
|
56
52
|
import { QueryResultModifierModal } from './QueryBuilderResultModifierPanel.js';
|
57
53
|
import { QUERY_BUILDER_TEST_ID } from './QueryBuilder_TestID.js';
|
58
|
-
import
|
54
|
+
import {
|
55
|
+
type QueryBuilderAggregateOperator,
|
56
|
+
QueryBuilderAggregateColumnState,
|
57
|
+
} from '../stores/QueryBuilderAggregationState.js';
|
59
58
|
import { flowResult } from 'mobx';
|
60
59
|
import { QueryBuilderLambdaEditor } from './QueryBuilderLambdaEditor.js';
|
61
60
|
import { useApplicationStore } from '@finos/legend-application';
|
62
61
|
import {
|
63
62
|
type QueryBuilderParameterDragSource,
|
64
|
-
|
63
|
+
QUERY_BUILDER_PARAMETER_DND_TYPE,
|
65
64
|
} from '../stores/QueryParametersState.js';
|
66
65
|
import {
|
67
66
|
type ConcreteFunctionDefinition,
|
@@ -71,51 +70,12 @@ import {
|
|
71
70
|
} from '@finos/legend-graph';
|
72
71
|
import {
|
73
72
|
type QueryBuilderFunctionsExplorerDragSource,
|
74
|
-
|
73
|
+
QUERY_BUILDER_FUNCTION_DND_TYPE,
|
75
74
|
} from '../stores/QueryFunctionsExplorerState.js';
|
76
75
|
import { DEFAULT_LAMBDA_VARIABLE_NAME } from '../QueryBuilder_Const.js';
|
77
76
|
import { QueryBuilderPostFilterTreeConditionNodeData } from '../stores/QueryBuilderPostFilterState.js';
|
78
77
|
import { filterByType } from '@finos/legend-shared';
|
79
78
|
|
80
|
-
const ProjectionColumnDragLayer: React.FC = () => {
|
81
|
-
const { itemType, item, isDragging, currentPosition } = useDragLayer(
|
82
|
-
(monitor) => ({
|
83
|
-
itemType: monitor.getItemType(),
|
84
|
-
item: monitor.getItem<QueryBuilderProjectionColumnDragSource | null>(),
|
85
|
-
isDragging: monitor.isDragging(),
|
86
|
-
initialOffset: monitor.getInitialSourceClientOffset(),
|
87
|
-
currentPosition: monitor.getClientOffset(),
|
88
|
-
}),
|
89
|
-
);
|
90
|
-
|
91
|
-
if (
|
92
|
-
!isDragging ||
|
93
|
-
!item ||
|
94
|
-
itemType !== QUERY_BUILDER_PROJECTION_DND_TYPE.PROJECTION_COLUMN
|
95
|
-
) {
|
96
|
-
return null;
|
97
|
-
}
|
98
|
-
return (
|
99
|
-
<div className="query-builder__projection__column__drag-preview-layer">
|
100
|
-
<div
|
101
|
-
className="query-builder__projection__column__drag-preview"
|
102
|
-
// added some offset so the mouse doesn't overlap the label too much
|
103
|
-
style={
|
104
|
-
!currentPosition
|
105
|
-
? { display: 'none' }
|
106
|
-
: {
|
107
|
-
transform: `translate(${currentPosition.x + 20}px, ${
|
108
|
-
currentPosition.y + 10
|
109
|
-
}px)`,
|
110
|
-
}
|
111
|
-
}
|
112
|
-
>
|
113
|
-
{item.columnState.columnName}
|
114
|
-
</div>
|
115
|
-
</div>
|
116
|
-
);
|
117
|
-
};
|
118
|
-
|
119
79
|
const QueryBuilderProjectionColumnContextMenu = observer(
|
120
80
|
forwardRef<
|
121
81
|
HTMLDivElement,
|
@@ -192,7 +152,7 @@ const QueryBuilderDerivationProjectionColumnEditor = observer(
|
|
192
152
|
| QueryBuilderFunctionsExplorerDragSource,
|
193
153
|
type: string,
|
194
154
|
): void => {
|
195
|
-
if (type ===
|
155
|
+
if (type === QUERY_BUILDER_PARAMETER_DND_TYPE) {
|
196
156
|
projectionColumnState.derivationLambdaEditorState.setLambdaString(
|
197
157
|
`${
|
198
158
|
projectionColumnState.derivationLambdaEditorState.lambdaString
|
@@ -200,9 +160,7 @@ const QueryBuilderDerivationProjectionColumnEditor = observer(
|
|
200
160
|
(item as QueryBuilderParameterDragSource).variable.variableName
|
201
161
|
}`,
|
202
162
|
);
|
203
|
-
} else if (
|
204
|
-
type === QUERY_BUILDER_FUNCTIONS_EXPLORER_TREE_DND_TYPE.FUNCTION
|
205
|
-
) {
|
163
|
+
} else if (type === QUERY_BUILDER_FUNCTION_DND_TYPE) {
|
206
164
|
projectionColumnState.derivationLambdaEditorState.setLambdaString(
|
207
165
|
`${
|
208
166
|
projectionColumnState.derivationLambdaEditorState.lambdaString
|
@@ -220,23 +178,21 @@ const QueryBuilderDerivationProjectionColumnEditor = observer(
|
|
220
178
|
},
|
221
179
|
[projectionColumnState],
|
222
180
|
);
|
223
|
-
const [, dropConnector] = useDrop
|
181
|
+
const [, dropConnector] = useDrop<
|
182
|
+
| QueryBuilderExplorerTreeDragSource
|
183
|
+
| QueryBuilderParameterDragSource
|
184
|
+
| QueryBuilderFunctionsExplorerDragSource
|
185
|
+
>(
|
224
186
|
() => ({
|
225
187
|
accept: [
|
226
188
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ROOT,
|
227
189
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.CLASS_PROPERTY,
|
228
190
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ENUM_PROPERTY,
|
229
191
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY,
|
230
|
-
|
231
|
-
|
192
|
+
QUERY_BUILDER_PARAMETER_DND_TYPE,
|
193
|
+
QUERY_BUILDER_FUNCTION_DND_TYPE,
|
232
194
|
],
|
233
|
-
drop: (
|
234
|
-
item:
|
235
|
-
| QueryBuilderExplorerTreeDragSource
|
236
|
-
| QueryBuilderParameterDragSource
|
237
|
-
| QueryBuilderFunctionsExplorerDragSource,
|
238
|
-
monitor,
|
239
|
-
): void => {
|
195
|
+
drop: (item, monitor): void => {
|
240
196
|
if (!monitor.didDrop()) {
|
241
197
|
handleDrop(item, monitor.getItemType() as string);
|
242
198
|
} // prevent drop event propagation to accomondate for nested DnD
|
@@ -271,10 +227,7 @@ const QueryBuilderDerivationProjectionColumnEditor = observer(
|
|
271
227
|
);
|
272
228
|
|
273
229
|
const QueryBuilderProjectionColumnEditor = observer(
|
274
|
-
(props: {
|
275
|
-
projectionColumnState: QueryBuilderProjectionColumnState;
|
276
|
-
isRearrangingColumns: boolean;
|
277
|
-
}) => {
|
230
|
+
(props: { projectionColumnState: QueryBuilderProjectionColumnState }) => {
|
278
231
|
const ref = useRef<HTMLDivElement>(null);
|
279
232
|
|
280
233
|
const [isSelectedFromContextMenu, setIsSelectedFromContextMenu] =
|
@@ -282,18 +235,26 @@ const QueryBuilderProjectionColumnEditor = observer(
|
|
282
235
|
const onContextMenuOpen = (): void => setIsSelectedFromContextMenu(true);
|
283
236
|
const onContextMenuClose = (): void => setIsSelectedFromContextMenu(false);
|
284
237
|
|
285
|
-
const { projectionColumnState
|
238
|
+
const { projectionColumnState } = props;
|
286
239
|
const queryBuilderState =
|
287
240
|
projectionColumnState.projectionState.queryBuilderState;
|
288
241
|
const projectionState =
|
289
242
|
queryBuilderState.fetchStructureState.projectionState;
|
290
|
-
|
291
|
-
const isRemovalDisabled = Array.from(
|
243
|
+
const postFilterColumnStates = Array.from(
|
292
244
|
queryBuilderState.postFilterState.nodes.values(),
|
293
245
|
)
|
294
246
|
.filter(filterByType(QueryBuilderPostFilterTreeConditionNodeData))
|
295
|
-
.map((n) => n.condition.columnState)
|
296
|
-
|
247
|
+
.map((n) => n.condition.columnState);
|
248
|
+
|
249
|
+
const isRemovalDisabled =
|
250
|
+
postFilterColumnStates
|
251
|
+
.filter((co) => co instanceof QueryBuilderAggregateColumnState)
|
252
|
+
.map(
|
253
|
+
(co) =>
|
254
|
+
(co as QueryBuilderAggregateColumnState).projectionColumnState,
|
255
|
+
)
|
256
|
+
.includes(projectionColumnState) ||
|
257
|
+
postFilterColumnStates.includes(projectionColumnState);
|
297
258
|
|
298
259
|
const removeColumn = (): void =>
|
299
260
|
projectionState.removeColumn(projectionColumnState);
|
@@ -342,8 +303,7 @@ const QueryBuilderProjectionColumnEditor = observer(
|
|
342
303
|
((hoverBoundingReact?.bottom ?? 0) - (hoverBoundingReact?.top ?? 0)) /
|
343
304
|
2;
|
344
305
|
const dragDistance =
|
345
|
-
(monitor.getClientOffset()
|
346
|
-
(hoverBoundingReact?.top ?? 0);
|
306
|
+
(monitor.getClientOffset()?.y ?? 0) - (hoverBoundingReact?.top ?? 0);
|
347
307
|
if (dragIndex < hoverIndex && dragDistance < distanceThreshold) {
|
348
308
|
return;
|
349
309
|
}
|
@@ -354,50 +314,54 @@ const QueryBuilderProjectionColumnEditor = observer(
|
|
354
314
|
},
|
355
315
|
[projectionColumnState, projectionState],
|
356
316
|
);
|
357
|
-
const [, dropConnector] = useDrop(
|
317
|
+
const [, dropConnector] = useDrop<QueryBuilderProjectionColumnDragSource>(
|
358
318
|
() => ({
|
359
|
-
accept: [
|
360
|
-
hover: (
|
361
|
-
item: QueryBuilderProjectionColumnDragSource,
|
362
|
-
monitor: DropTargetMonitor,
|
363
|
-
): void => handleHover(item, monitor),
|
319
|
+
accept: [QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE],
|
320
|
+
hover: (item, monitor): void => handleHover(item, monitor),
|
364
321
|
}),
|
365
322
|
[handleHover],
|
366
323
|
);
|
367
|
-
const [
|
324
|
+
const [
|
325
|
+
{ projectionColumnBeingDragged },
|
326
|
+
dragConnector,
|
327
|
+
dragPreviewConnector,
|
328
|
+
] = useDrag<
|
329
|
+
QueryBuilderProjectionColumnDragSource,
|
330
|
+
void,
|
331
|
+
{
|
332
|
+
projectionColumnBeingDragged:
|
333
|
+
| QueryBuilderProjectionColumnState
|
334
|
+
| undefined;
|
335
|
+
}
|
336
|
+
>(
|
368
337
|
() => ({
|
369
|
-
type:
|
370
|
-
item: ()
|
371
|
-
projectionColumnState
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
338
|
+
type: QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE,
|
339
|
+
item: () => ({
|
340
|
+
columnState: projectionColumnState,
|
341
|
+
}),
|
342
|
+
collect: (monitor) => ({
|
343
|
+
/**
|
344
|
+
* @workaround typings - https://github.com/react-dnd/react-dnd/pull/3484
|
345
|
+
*/
|
346
|
+
projectionColumnBeingDragged:
|
347
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
|
348
|
+
(monitor.getItem() as QueryBuilderProjectionColumnDragSource | null)
|
349
|
+
?.columnState,
|
350
|
+
}),
|
376
351
|
}),
|
377
352
|
[projectionColumnState],
|
378
353
|
);
|
354
|
+
const isBeingDragged =
|
355
|
+
projectionColumnState === projectionColumnBeingDragged;
|
379
356
|
dragConnector(dropConnector(ref));
|
380
|
-
|
381
|
-
// hide default HTML5 preview image
|
382
|
-
useEffect(() => {
|
383
|
-
dragPreviewConnector(getEmptyImage(), { captureDraggingState: true });
|
384
|
-
}, [dragPreviewConnector]);
|
357
|
+
useDragPreviewLayer(dragPreviewConnector);
|
385
358
|
|
386
359
|
return (
|
387
|
-
<div
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
'query-builder__projection__column--no-hover': isRearrangingColumns,
|
393
|
-
})}
|
394
|
-
>
|
395
|
-
{projectionColumnState.isBeingDragged && (
|
396
|
-
<div className="query-builder__projection__column__dnd__placeholder__container">
|
397
|
-
<div className="query-builder__dnd__placeholder query-builder__projection__column__dnd__placeholder" />
|
398
|
-
</div>
|
399
|
-
)}
|
400
|
-
{!projectionColumnState.isBeingDragged && (
|
360
|
+
<div ref={ref} className="query-builder__projection__column">
|
361
|
+
<PanelEntryDropZonePlaceholder
|
362
|
+
showPlaceholder={isBeingDragged}
|
363
|
+
className="query-builder__dnd__placeholder"
|
364
|
+
>
|
401
365
|
<ContextMenu
|
402
366
|
content={
|
403
367
|
<QueryBuilderProjectionColumnContextMenu
|
@@ -418,8 +382,8 @@ const QueryBuilderProjectionColumnEditor = observer(
|
|
418
382
|
onOpen={onContextMenuOpen}
|
419
383
|
onClose={onContextMenuClose}
|
420
384
|
>
|
421
|
-
<div className="query-
|
422
|
-
<div className="query-
|
385
|
+
<div className="query-builder__projection__column__drag-handle__container">
|
386
|
+
<div className="query-builder__projection__column__drag-handle">
|
423
387
|
<VerticalDragHandleIcon />
|
424
388
|
</div>
|
425
389
|
</div>
|
@@ -527,7 +491,7 @@ const QueryBuilderProjectionColumnEditor = observer(
|
|
527
491
|
</button>
|
528
492
|
</div>
|
529
493
|
</ContextMenu>
|
530
|
-
|
494
|
+
</PanelEntryDropZonePlaceholder>
|
531
495
|
</div>
|
532
496
|
);
|
533
497
|
},
|
@@ -540,10 +504,6 @@ export const QueryBuilderProjectionPanel = observer(
|
|
540
504
|
const projectionState =
|
541
505
|
queryBuilderState.fetchStructureState.projectionState;
|
542
506
|
const projectionColumns = projectionState.columns;
|
543
|
-
// Drag and Drop
|
544
|
-
const isRearrangingColumns = projectionColumns.some(
|
545
|
-
(columnState) => columnState.isBeingDragged,
|
546
|
-
);
|
547
507
|
const handleDrop = useCallback(
|
548
508
|
(
|
549
509
|
item:
|
@@ -552,11 +512,13 @@ export const QueryBuilderProjectionPanel = observer(
|
|
552
512
|
type: string,
|
553
513
|
): void => {
|
554
514
|
switch (type) {
|
555
|
-
case
|
515
|
+
case QUERY_BUILDER_FUNCTION_DND_TYPE: {
|
556
516
|
const derivationProjectionColumn =
|
557
517
|
new QueryBuilderDerivationProjectionColumnState(
|
558
518
|
projectionState,
|
559
|
-
queryBuilderState.graphManagerState.graphManager.
|
519
|
+
queryBuilderState.graphManagerState.graphManager.createDefaultBasicRawLambda(
|
520
|
+
{ addDummyParameter: true },
|
521
|
+
),
|
560
522
|
);
|
561
523
|
derivationProjectionColumn.derivationLambdaEditorState.setLambdaString(
|
562
524
|
`${DEFAULT_LAMBDA_VARIABLE_NAME}${LAMBDA_PIPE}${generateFunctionCallString(
|
@@ -590,26 +552,25 @@ export const QueryBuilderProjectionPanel = observer(
|
|
590
552
|
[queryBuilderState, projectionState],
|
591
553
|
);
|
592
554
|
|
593
|
-
const
|
594
|
-
|
555
|
+
const [{ isDragOver }, dropTargetConnector] = useDrop<
|
556
|
+
| QueryBuilderExplorerTreeDragSource
|
557
|
+
| QueryBuilderFunctionsExplorerDragSource,
|
558
|
+
void,
|
559
|
+
{ isDragOver: boolean }
|
560
|
+
>(
|
595
561
|
() => ({
|
596
562
|
accept: [
|
597
563
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ENUM_PROPERTY,
|
598
564
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY,
|
599
|
-
|
565
|
+
QUERY_BUILDER_FUNCTION_DND_TYPE,
|
600
566
|
],
|
601
|
-
drop: (
|
602
|
-
item:
|
603
|
-
| QueryBuilderExplorerTreeDragSource
|
604
|
-
| QueryBuilderFunctionsExplorerDragSource,
|
605
|
-
monitor: DropTargetMonitor,
|
606
|
-
): void => {
|
567
|
+
drop: (item, monitor): void => {
|
607
568
|
if (!monitor.didDrop()) {
|
608
569
|
handleDrop(item, monitor.getItemType() as string);
|
609
570
|
} // prevent drop event propagation to accomondate for nested DnD
|
610
571
|
},
|
611
|
-
collect: (monitor)
|
612
|
-
|
572
|
+
collect: (monitor) => ({
|
573
|
+
isDragOver: monitor.isOver({ shallow: true }),
|
613
574
|
}),
|
614
575
|
}),
|
615
576
|
[handleDrop],
|
@@ -622,47 +583,42 @@ export const QueryBuilderProjectionPanel = observer(
|
|
622
583
|
}, [applicationStore, projectionState]);
|
623
584
|
|
624
585
|
return (
|
625
|
-
<div
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
<
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
className={`query-builder__projection__columns ${clsx({
|
651
|
-
['query-builder__projection__columns--with-error']:
|
652
|
-
isInvalidProjection,
|
653
|
-
})} `}
|
654
|
-
>
|
655
|
-
<ProjectionColumnDragLayer />
|
656
|
-
{projectionColumns.map((projectionColumnState) => (
|
657
|
-
<QueryBuilderProjectionColumnEditor
|
658
|
-
key={projectionColumnState.uuid}
|
659
|
-
projectionColumnState={projectionColumnState}
|
660
|
-
isRearrangingColumns={isRearrangingColumns}
|
586
|
+
<div className="panel__content">
|
587
|
+
<PanelDropZone
|
588
|
+
isDragOver={isDragOver}
|
589
|
+
dropTargetConnector={dropTargetConnector}
|
590
|
+
>
|
591
|
+
{!projectionColumns.length && (
|
592
|
+
<BlankPanelPlaceholder
|
593
|
+
text="Add a projection column"
|
594
|
+
tooltipText="Drag and drop properties here"
|
595
|
+
/>
|
596
|
+
)}
|
597
|
+
{Boolean(projectionColumns.length) && (
|
598
|
+
<div
|
599
|
+
data-testid={QUERY_BUILDER_TEST_ID.QUERY_BUILDER_PROJECTION}
|
600
|
+
className="query-builder__projection__columns"
|
601
|
+
>
|
602
|
+
<DragPreviewLayer
|
603
|
+
labelGetter={(
|
604
|
+
item: QueryBuilderProjectionColumnDragSource,
|
605
|
+
): string =>
|
606
|
+
item.columnState.columnName === ''
|
607
|
+
? '(unknown)'
|
608
|
+
: item.columnState.columnName
|
609
|
+
}
|
610
|
+
types={[QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE]}
|
661
611
|
/>
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
612
|
+
{projectionColumns.map((projectionColumnState) => (
|
613
|
+
<QueryBuilderProjectionColumnEditor
|
614
|
+
key={projectionColumnState.uuid}
|
615
|
+
projectionColumnState={projectionColumnState}
|
616
|
+
/>
|
617
|
+
))}
|
618
|
+
</div>
|
619
|
+
)}
|
620
|
+
<QueryResultModifierModal queryBuilderState={queryBuilderState} />
|
621
|
+
</PanelDropZone>
|
666
622
|
</div>
|
667
623
|
);
|
668
624
|
},
|
@@ -15,7 +15,13 @@
|
|
15
15
|
*/
|
16
16
|
|
17
17
|
import { useCallback } from 'react';
|
18
|
-
import {
|
18
|
+
import {
|
19
|
+
clsx,
|
20
|
+
Dialog,
|
21
|
+
PanelDropZone,
|
22
|
+
InfoCircleIcon,
|
23
|
+
PanelEntryDropZonePlaceholder,
|
24
|
+
} from '@finos/legend-art';
|
19
25
|
import { observer } from 'mobx-react-lite';
|
20
26
|
import {
|
21
27
|
generateMilestonedPropertyParameterValue,
|
@@ -24,7 +30,7 @@ import {
|
|
24
30
|
type QueryBuilderDerivedPropertyExpressionState,
|
25
31
|
type QueryBuilderPropertyExpressionState,
|
26
32
|
} from '../stores/QueryBuilderPropertyEditorState.js';
|
27
|
-
import {
|
33
|
+
import { useDrop } from 'react-dnd';
|
28
34
|
import {
|
29
35
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE,
|
30
36
|
type QueryBuilderExplorerTreeDragSource,
|
@@ -34,7 +40,7 @@ import { QueryBuilderPropertyInfoTooltip } from './QueryBuilderPropertyInfoToolt
|
|
34
40
|
import { VariableExpressionViewer } from './QueryBuilderParameterPanel.js';
|
35
41
|
import {
|
36
42
|
type QueryBuilderParameterDragSource,
|
37
|
-
|
43
|
+
QUERY_BUILDER_PARAMETER_DND_TYPE,
|
38
44
|
} from '../stores/QueryParametersState.js';
|
39
45
|
import {
|
40
46
|
type ValueSpecification,
|
@@ -74,13 +80,14 @@ const DerivedPropertyParameterValueEditor = observer(
|
|
74
80
|
},
|
75
81
|
[derivedPropertyExpressionState, idx],
|
76
82
|
);
|
77
|
-
const [{ isParameterValueDragOver },
|
83
|
+
const [{ isParameterValueDragOver }, dropTargetConnector] = useDrop<
|
84
|
+
QueryBuilderParameterDragSource,
|
85
|
+
void,
|
86
|
+
{ isParameterValueDragOver: boolean }
|
87
|
+
>(
|
78
88
|
() => ({
|
79
|
-
accept: [
|
80
|
-
drop: (
|
81
|
-
item: QueryBuilderParameterDragSource,
|
82
|
-
monitor: DropTargetMonitor,
|
83
|
-
): void => {
|
89
|
+
accept: [QUERY_BUILDER_PARAMETER_DND_TYPE],
|
90
|
+
drop: (item, monitor): void => {
|
84
91
|
const itemType = item.variable.parameter.genericType?.value.rawType;
|
85
92
|
if (
|
86
93
|
!monitor.didDrop() &&
|
@@ -90,9 +97,9 @@ const DerivedPropertyParameterValueEditor = observer(
|
|
90
97
|
parameterType.name === itemType.name)
|
91
98
|
) {
|
92
99
|
handleDrop(item);
|
93
|
-
}
|
100
|
+
} // prevent drop event propagation to accomondate for nested DnD
|
94
101
|
},
|
95
|
-
collect: (monitor)
|
102
|
+
collect: (monitor) => ({
|
96
103
|
isParameterValueDragOver: monitor.isOver({
|
97
104
|
shallow: true,
|
98
105
|
}),
|
@@ -125,37 +132,34 @@ const DerivedPropertyParameterValueEditor = observer(
|
|
125
132
|
<div className="panel__content__form__section__header__prompt">{`${
|
126
133
|
variable.multiplicity.lowerBound === 0 ? 'optional' : ''
|
127
134
|
}`}</div>
|
128
|
-
<div
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
<
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
}}
|
157
|
-
resetValue={resetParameterValue}
|
158
|
-
/>
|
135
|
+
<div className="query-builder__parameter-editor">
|
136
|
+
<PanelDropZone
|
137
|
+
isDragOver={isParameterValueDragOver}
|
138
|
+
dropTargetConnector={dropTargetConnector}
|
139
|
+
>
|
140
|
+
<BasicValueSpecificationEditor
|
141
|
+
valueSpecification={guaranteeNonNullable(
|
142
|
+
derivedPropertyExpressionState.parameterValues[idx],
|
143
|
+
)}
|
144
|
+
setValueSpecification={(val: ValueSpecification): void => {
|
145
|
+
propertyExpression_setParametersValue(
|
146
|
+
derivedPropertyExpressionState.propertyExpression,
|
147
|
+
idx + 1,
|
148
|
+
val,
|
149
|
+
derivedPropertyExpressionState.queryBuilderState
|
150
|
+
.observableContext,
|
151
|
+
);
|
152
|
+
}}
|
153
|
+
graph={graph}
|
154
|
+
typeCheckOption={{
|
155
|
+
expectedType: parameterType,
|
156
|
+
match:
|
157
|
+
parameterType ===
|
158
|
+
graph.getPrimitiveType(PRIMITIVE_TYPE.DATETIME),
|
159
|
+
}}
|
160
|
+
resetValue={resetParameterValue}
|
161
|
+
/>
|
162
|
+
</PanelDropZone>
|
159
163
|
</div>
|
160
164
|
<div className="panel__content__form__section__list"></div>
|
161
165
|
</div>
|
@@ -282,22 +286,23 @@ export const QueryBuilderPropertyExpressionBadge = observer(
|
|
282
286
|
onPropertyExpressionChange(item.node),
|
283
287
|
[onPropertyExpressionChange],
|
284
288
|
);
|
285
|
-
const [{
|
289
|
+
const [{ isDragOver }, dropConnector] = useDrop<
|
290
|
+
QueryBuilderExplorerTreeDragSource,
|
291
|
+
void,
|
292
|
+
{ isDragOver: boolean }
|
293
|
+
>(
|
286
294
|
() => ({
|
287
295
|
accept: [
|
288
296
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ENUM_PROPERTY,
|
289
297
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY,
|
290
298
|
],
|
291
|
-
drop: (
|
292
|
-
item: QueryBuilderExplorerTreeDragSource,
|
293
|
-
monitor: DropTargetMonitor,
|
294
|
-
): void => {
|
299
|
+
drop: (item, monitor): void => {
|
295
300
|
if (!monitor.didDrop()) {
|
296
301
|
handleDrop(item);
|
297
302
|
} // prevent drop event propagation to accomondate for nested DnD
|
298
303
|
},
|
299
|
-
collect: (monitor)
|
300
|
-
|
304
|
+
collect: (monitor) => ({
|
305
|
+
isDragOver: monitor.isOver({ shallow: true }),
|
301
306
|
}),
|
302
307
|
}),
|
303
308
|
[handleDrop],
|
@@ -305,15 +310,14 @@ export const QueryBuilderPropertyExpressionBadge = observer(
|
|
305
310
|
|
306
311
|
return (
|
307
312
|
<div
|
308
|
-
ref={dropConnector}
|
309
313
|
className="query-builder-property-expression-badge"
|
314
|
+
ref={dropConnector}
|
310
315
|
>
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
{!isPropertyDragOver && (
|
316
|
+
<PanelEntryDropZonePlaceholder
|
317
|
+
showPlaceholder={isDragOver}
|
318
|
+
label="Change Property"
|
319
|
+
className="query-builder__dnd__placeholder"
|
320
|
+
>
|
317
321
|
<div
|
318
322
|
className={clsx(
|
319
323
|
'query-builder-property-expression-badge__content',
|
@@ -363,7 +367,7 @@ export const QueryBuilderPropertyExpressionBadge = observer(
|
|
363
367
|
</div>
|
364
368
|
</QueryBuilderPropertyInfoTooltip>
|
365
369
|
</div>
|
366
|
-
|
370
|
+
</PanelEntryDropZonePlaceholder>
|
367
371
|
</div>
|
368
372
|
);
|
369
373
|
},
|