@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.
Files changed (177) hide show
  1. package/lib/application/LegendQueryApplicationConfig.d.ts +17 -1
  2. package/lib/application/LegendQueryApplicationConfig.d.ts.map +1 -1
  3. package/lib/application/LegendQueryApplicationConfig.js +23 -1
  4. package/lib/application/LegendQueryApplicationConfig.js.map +1 -1
  5. package/lib/components/QueryBuilder.d.ts.map +1 -1
  6. package/lib/components/QueryBuilder.js +3 -1
  7. package/lib/components/QueryBuilder.js.map +1 -1
  8. package/lib/components/QueryBuilderExplorerPanel.d.ts.map +1 -1
  9. package/lib/components/QueryBuilderExplorerPanel.js +7 -34
  10. package/lib/components/QueryBuilderExplorerPanel.js.map +1 -1
  11. package/lib/components/QueryBuilderFetchStructurePanel.d.ts.map +1 -1
  12. package/lib/components/QueryBuilderFetchStructurePanel.js +77 -66
  13. package/lib/components/QueryBuilderFetchStructurePanel.js.map +1 -1
  14. package/lib/components/QueryBuilderFilterPanel.d.ts.map +1 -1
  15. package/lib/components/QueryBuilderFilterPanel.js +28 -58
  16. package/lib/components/QueryBuilderFilterPanel.js.map +1 -1
  17. package/lib/components/QueryBuilderFunctionsExplorerPanel.d.ts.map +1 -1
  18. package/lib/components/QueryBuilderFunctionsExplorerPanel.js +9 -39
  19. package/lib/components/QueryBuilderFunctionsExplorerPanel.js.map +1 -1
  20. package/lib/components/QueryBuilderGraphFetchTreePanel.d.ts.map +1 -1
  21. package/lib/components/QueryBuilderGraphFetchTreePanel.js +5 -5
  22. package/lib/components/QueryBuilderGraphFetchTreePanel.js.map +1 -1
  23. package/lib/components/QueryBuilderLambdaEditor.d.ts +1 -0
  24. package/lib/components/QueryBuilderLambdaEditor.d.ts.map +1 -1
  25. package/lib/components/QueryBuilderLambdaEditor.js +2 -2
  26. package/lib/components/QueryBuilderLambdaEditor.js.map +1 -1
  27. package/lib/components/QueryBuilderMilestoneEditor.js +5 -5
  28. package/lib/components/QueryBuilderMilestoneEditor.js.map +1 -1
  29. package/lib/components/QueryBuilderPanelIssueCountBadge.d.ts +20 -0
  30. package/lib/components/QueryBuilderPanelIssueCountBadge.d.ts.map +1 -0
  31. package/lib/components/QueryBuilderPanelIssueCountBadge.js +28 -0
  32. package/lib/components/QueryBuilderPanelIssueCountBadge.js.map +1 -0
  33. package/lib/components/QueryBuilderParameterPanel.d.ts.map +1 -1
  34. package/lib/components/QueryBuilderParameterPanel.js +13 -34
  35. package/lib/components/QueryBuilderParameterPanel.js.map +1 -1
  36. package/lib/components/QueryBuilderPostFilterPanel.d.ts.map +1 -1
  37. package/lib/components/QueryBuilderPostFilterPanel.js +33 -58
  38. package/lib/components/QueryBuilderPostFilterPanel.js.map +1 -1
  39. package/lib/components/QueryBuilderProjectionPanel.d.ts.map +1 -1
  40. package/lib/components/QueryBuilderProjectionPanel.js +47 -67
  41. package/lib/components/QueryBuilderProjectionPanel.js.map +1 -1
  42. package/lib/components/QueryBuilderPropertyExpressionEditor.d.ts.map +1 -1
  43. package/lib/components/QueryBuilderPropertyExpressionEditor.js +11 -11
  44. package/lib/components/QueryBuilderPropertyExpressionEditor.js.map +1 -1
  45. package/lib/components/QueryBuilderPropertySearchPanel.d.ts.map +1 -1
  46. package/lib/components/QueryBuilderPropertySearchPanel.js +3 -6
  47. package/lib/components/QueryBuilderPropertySearchPanel.js.map +1 -1
  48. package/lib/components/QueryBuilderResultModifierPanel.d.ts.map +1 -1
  49. package/lib/components/QueryBuilderResultModifierPanel.js +3 -1
  50. package/lib/components/QueryBuilderResultModifierPanel.js.map +1 -1
  51. package/lib/components/QueryBuilderResultPanel.d.ts.map +1 -1
  52. package/lib/components/QueryBuilderResultPanel.js +28 -20
  53. package/lib/components/QueryBuilderResultPanel.js.map +1 -1
  54. package/lib/components/QueryBuilderSetupPanel.d.ts.map +1 -1
  55. package/lib/components/QueryBuilderSetupPanel.js +10 -11
  56. package/lib/components/QueryBuilderSetupPanel.js.map +1 -1
  57. package/lib/components/QueryBuilderUnsupportedQueryEditor.d.ts.map +1 -1
  58. package/lib/components/QueryBuilderUnsupportedQueryEditor.js +4 -2
  59. package/lib/components/QueryBuilderUnsupportedQueryEditor.js.map +1 -1
  60. package/lib/components/QueryEditor.d.ts.map +1 -1
  61. package/lib/components/QueryEditor.js +16 -4
  62. package/lib/components/QueryEditor.js.map +1 -1
  63. package/lib/index.css +2 -2
  64. package/lib/index.css.map +1 -1
  65. package/lib/package.json +10 -9
  66. package/lib/stores/QueryBuilderExplorerState.d.ts.map +1 -1
  67. package/lib/stores/QueryBuilderExplorerState.js +5 -0
  68. package/lib/stores/QueryBuilderExplorerState.js.map +1 -1
  69. package/lib/stores/QueryBuilderFetchStructureState.d.ts +6 -0
  70. package/lib/stores/QueryBuilderFetchStructureState.d.ts.map +1 -1
  71. package/lib/stores/QueryBuilderFetchStructureState.js +8 -0
  72. package/lib/stores/QueryBuilderFetchStructureState.js.map +1 -1
  73. package/lib/stores/QueryBuilderFilterState.d.ts +4 -9
  74. package/lib/stores/QueryBuilderFilterState.d.ts.map +1 -1
  75. package/lib/stores/QueryBuilderFilterState.js +6 -11
  76. package/lib/stores/QueryBuilderFilterState.js.map +1 -1
  77. package/lib/stores/QueryBuilderGraphFetchTreeState.d.ts.map +1 -1
  78. package/lib/stores/QueryBuilderGraphFetchTreeState.js +6 -3
  79. package/lib/stores/QueryBuilderGraphFetchTreeState.js.map +1 -1
  80. package/lib/stores/QueryBuilderLambdaProcessor.d.ts.map +1 -1
  81. package/lib/stores/QueryBuilderLambdaProcessor.js +2 -0
  82. package/lib/stores/QueryBuilderLambdaProcessor.js.map +1 -1
  83. package/lib/stores/QueryBuilderPostFilterState.d.ts +4 -4
  84. package/lib/stores/QueryBuilderPostFilterState.d.ts.map +1 -1
  85. package/lib/stores/QueryBuilderPostFilterState.js +6 -6
  86. package/lib/stores/QueryBuilderPostFilterState.js.map +1 -1
  87. package/lib/stores/QueryBuilderProjectionState.d.ts +2 -7
  88. package/lib/stores/QueryBuilderProjectionState.d.ts.map +1 -1
  89. package/lib/stores/QueryBuilderProjectionState.js +5 -17
  90. package/lib/stores/QueryBuilderProjectionState.js.map +1 -1
  91. package/lib/stores/QueryBuilderSetupState.js +1 -1
  92. package/lib/stores/QueryBuilderSetupState.js.map +1 -1
  93. package/lib/stores/QueryBuilderState.d.ts +6 -1
  94. package/lib/stores/QueryBuilderState.d.ts.map +1 -1
  95. package/lib/stores/QueryBuilderState.js +9 -2
  96. package/lib/stores/QueryBuilderState.js.map +1 -1
  97. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.d.ts.map +1 -1
  98. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.js +7 -7
  99. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.js.map +1 -1
  100. package/lib/stores/QueryEditorStore.d.ts.map +1 -1
  101. package/lib/stores/QueryEditorStore.js +14 -3
  102. package/lib/stores/QueryEditorStore.js.map +1 -1
  103. package/lib/stores/QueryFunctionsExplorerState.d.ts +2 -6
  104. package/lib/stores/QueryFunctionsExplorerState.d.ts.map +1 -1
  105. package/lib/stores/QueryFunctionsExplorerState.js +2 -11
  106. package/lib/stores/QueryFunctionsExplorerState.js.map +1 -1
  107. package/lib/stores/QueryParametersState.d.ts +1 -3
  108. package/lib/stores/QueryParametersState.d.ts.map +1 -1
  109. package/lib/stores/QueryParametersState.js +1 -4
  110. package/lib/stores/QueryParametersState.js.map +1 -1
  111. package/lib/stores/filterOperators/QueryBuilderFilterOperator_Equal.d.ts.map +1 -1
  112. package/lib/stores/filterOperators/QueryBuilderFilterOperator_Equal.js +4 -1
  113. package/lib/stores/filterOperators/QueryBuilderFilterOperator_Equal.js.map +1 -1
  114. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.d.ts.map +1 -1
  115. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.js +4 -1
  116. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.js.map +1 -1
  117. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.d.ts.map +1 -1
  118. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.js +4 -1
  119. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.js.map +1 -1
  120. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThan.d.ts.map +1 -1
  121. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThan.js +4 -1
  122. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThan.js.map +1 -1
  123. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.d.ts.map +1 -1
  124. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.js +4 -1
  125. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.js.map +1 -1
  126. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.d.ts.map +1 -1
  127. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.js +4 -1
  128. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.js.map +1 -1
  129. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.d.ts.map +1 -1
  130. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.js +4 -1
  131. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.js.map +1 -1
  132. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.d.ts.map +1 -1
  133. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.js +4 -1
  134. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.js.map +1 -1
  135. package/package.json +17 -16
  136. package/src/application/LegendQueryApplicationConfig.ts +35 -1
  137. package/src/components/QueryBuilder.tsx +13 -2
  138. package/src/components/QueryBuilderExplorerPanel.tsx +17 -56
  139. package/src/components/QueryBuilderFetchStructurePanel.tsx +93 -80
  140. package/src/components/QueryBuilderFilterPanel.tsx +184 -225
  141. package/src/components/QueryBuilderFunctionsExplorerPanel.tsx +23 -68
  142. package/src/components/QueryBuilderGraphFetchTreePanel.tsx +34 -25
  143. package/src/components/QueryBuilderLambdaEditor.tsx +3 -0
  144. package/src/components/QueryBuilderMilestoneEditor.tsx +34 -34
  145. package/src/components/QueryBuilderPanelIssueCountBadge.tsx +38 -0
  146. package/src/components/QueryBuilderParameterPanel.tsx +21 -54
  147. package/src/components/QueryBuilderPostFilterPanel.tsx +202 -236
  148. package/src/components/QueryBuilderProjectionPanel.tsx +126 -170
  149. package/src/components/QueryBuilderPropertyExpressionEditor.tsx +61 -57
  150. package/src/components/QueryBuilderPropertySearchPanel.tsx +8 -9
  151. package/src/components/QueryBuilderResultModifierPanel.tsx +4 -2
  152. package/src/components/QueryBuilderResultPanel.tsx +71 -52
  153. package/src/components/QueryBuilderSetupPanel.tsx +10 -11
  154. package/src/components/QueryBuilderUnsupportedQueryEditor.tsx +4 -2
  155. package/src/components/QueryEditor.tsx +39 -1
  156. package/src/stores/QueryBuilderExplorerState.ts +5 -0
  157. package/src/stores/QueryBuilderFetchStructureState.ts +9 -0
  158. package/src/stores/QueryBuilderFilterState.ts +7 -12
  159. package/src/stores/QueryBuilderGraphFetchTreeState.ts +14 -8
  160. package/src/stores/QueryBuilderLambdaProcessor.ts +8 -0
  161. package/src/stores/QueryBuilderPostFilterState.ts +7 -7
  162. package/src/stores/QueryBuilderProjectionState.ts +7 -18
  163. package/src/stores/QueryBuilderSetupState.ts +1 -1
  164. package/src/stores/QueryBuilderState.ts +10 -2
  165. package/src/stores/QueryBuilderValueSpecificationBuilderHelper.ts +9 -7
  166. package/src/stores/QueryEditorStore.ts +19 -3
  167. package/src/stores/QueryFunctionsExplorerState.ts +1 -11
  168. package/src/stores/QueryParametersState.ts +1 -3
  169. package/src/stores/filterOperators/QueryBuilderFilterOperator_Equal.ts +8 -1
  170. package/src/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.ts +8 -1
  171. package/src/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.ts +8 -1
  172. package/src/stores/filterOperators/QueryBuilderFilterOperator_LessThan.ts +8 -1
  173. package/src/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.ts +8 -1
  174. package/src/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.ts +8 -1
  175. package/src/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.ts +8 -1
  176. package/src/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.ts +8 -1
  177. 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
- QUERY_BUILDER_PARAMETER_TREE_DND_TYPE,
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
- QUERY_BUILDER_PROJECTION_DND_TYPE,
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
- isPropertyDragOver: boolean;
94
+ isDragOver: boolean;
143
95
  }) => {
144
- const { node, isPropertyDragOver } = props;
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 dnd__overlay__container">
157
- {isPropertyDragOver && (
158
- <div className="query-builder-filter-tree__node__dnd__overlay">
159
- Add to Logical Group
160
- </div>
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 className="query-builder-filter-tree__group-node__label">
173
- {node.groupOperation}
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
- <button className="query-builder-filter-tree__group-node__action">
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
- isPropertyDragOver: boolean;
140
+ isDragOver: boolean;
188
141
  }) => {
189
- const { node, isPropertyDragOver } = props;
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: [QUERY_BUILDER_PARAMETER_TREE_DND_TYPE.VARIABLE],
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): { isFilterValueDragOver: boolean } => ({
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 dnd__overlay__container">
276
- {isPropertyDragOver && (
277
- <div className="query-builder-filter-tree__node__dnd__overlay">
278
- Add New Logical Group
279
- </div>
280
- )}
281
- <div className="query-builder-filter-tree__condition-node">
282
- <div className="query-builder-filter-tree__condition-node__property">
283
- <QueryBuilderPropertyExpressionBadge
284
- propertyExpressionState={node.condition.propertyExpressionState}
285
- onPropertyExpressionChange={changeProperty}
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
- </div>
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
- isPropertyDragOver: boolean;
309
+ isDragOver: boolean;
354
310
  }) => {
355
- const { isPropertyDragOver } = props;
311
+ const { isDragOver } = props;
356
312
  return (
357
- <div className="query-builder-filter-tree__node__label__content dnd__overlay__container">
358
- {isPropertyDragOver && (
359
- <div className="query-builder-filter-tree__node__dnd__overlay">
360
- Create Condition
361
- </div>
362
- )}
363
- <div className="query-builder-filter-tree__blank-node">blank</div>
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 [{ isPropertyDragOver }, dropConnector] = useDrop(
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
- // canDrop: (item: QueryBuilderFilterConditionDragSource, monitor: DropTargetMonitor): boolean => {
514
- // // prevent drop inside of children
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] = useDrag(
525
- () => ({
526
- type:
527
- node instanceof QueryBuilderFilterTreeGroupNodeData
528
- ? QUERY_BUILDER_FILTER_DND_TYPE.GROUP_CONDITION
529
- : node instanceof QueryBuilderFilterTreeConditionNodeData
530
- ? QUERY_BUILDER_FILTER_DND_TYPE.CONDITION
531
- : QUERY_BUILDER_FILTER_DND_TYPE.BLANK_CONDITION,
532
- item: (): QueryBuilderFilterConditionDragSource => ({ node }),
533
- end: (): void => filterState.setRearrangingConditions(false),
534
- }),
535
- [node, filterState],
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
- // hide default HTML5 preview image
539
- useEffect(() => {
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
- isPropertyDragOver={isPropertyDragOver}
552
+ isDragOver={isDragOver}
601
553
  />
602
554
  )}
603
555
  {node instanceof QueryBuilderFilterTreeConditionNodeData && (
604
556
  <QueryBuilderFilterConditionEditor
605
557
  node={node}
606
- isPropertyDragOver={isPropertyDragOver}
558
+ isDragOver={isDragOver}
607
559
  />
608
560
  )}
609
561
  {node instanceof QueryBuilderFilterTreeBlankConditionNodeData && (
610
562
  <QueryBuilderFilterBlankConditionEditor
611
563
  node={node}
612
- isPropertyDragOver={isPropertyDragOver}
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 === QUERY_BUILDER_PROJECTION_DND_TYPE.PROJECTION_COLUMN) {
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 [{ isPropertyDragOver }, dropConnector] = useDrop(
767
+ const [{ isDragOver }, dropTargetConnector] = useDrop<
768
+ QueryBuilderExplorerTreeDragSource,
769
+ void,
770
+ { isDragOver: boolean }
771
+ >(
816
772
  () => ({
817
- accept: filterState.allowDnDProjectionToFilter
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
- QUERY_BUILDER_PROJECTION_DND_TYPE.PROJECTION_COLUMN,
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): { isPropertyDragOver: boolean } => ({
836
- isPropertyDragOver: monitor.isOver({ shallow: true }),
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
- className="panel__content query-builder__filter__content dnd__overlay__container"
919
- ref={dropConnector}
920
- >
921
- <div className={clsx({ dnd__overlay: isPropertyDragOver })} />
922
- {filterState.isEmpty && (
923
- <BlankPanelPlaceholder
924
- placeholderText="Add a filter condition"
925
- tooltipText="Drag and drop properties here"
926
- />
927
- )}
928
- {!filterState.isEmpty && (
929
- <>
930
- <FilterConditionDragLayer />
931
- <QueryBuilderFilterTree queryBuilderState={queryBuilderState} />
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
  );