@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
@@ -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
- forwardRef,
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
- QUERY_BUILDER_PROJECTION_DND_TYPE,
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
- QUERY_BUILDER_PARAMETER_TREE_DND_TYPE,
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
- isPropertyDragOver: boolean;
158
+ isDragOver: boolean;
207
159
  }) => {
208
- const { node, isPropertyDragOver } = props;
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 dnd__overlay__container">
221
- {isPropertyDragOver && (
222
- <div className="query-builder-post-filter-tree__node__dnd__overlay">
223
- Add to Logical Group
224
- </div>
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 className="query-builder-post-filter-tree__group-node__label">
237
- {node.groupOperation}
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
- <button className="query-builder-post-filter-tree__group-node__action">
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 [{ isPropertyDragOver }, dropConnector] = useDrop(
300
+ const [{ isDragOver }, dropConnector] = useDrop<
301
+ QueryBuilderProjectionColumnDragSource,
302
+ void,
303
+ { isDragOver: boolean }
304
+ >(
348
305
  () => ({
349
- accept: [QUERY_BUILDER_PROJECTION_DND_TYPE.PROJECTION_COLUMN],
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): { isPropertyDragOver: boolean } => ({
362
- isPropertyDragOver: monitor.isOver({ shallow: true }),
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
- {isPropertyDragOver && (
371
- <div className="query-builder__dnd__placeholder query-builder-column-badge__dnd__placeholder">
372
- Change Property
373
- </div>
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
- isPropertyDragOver: boolean;
367
+ isDragOver: boolean;
415
368
  }) => {
416
- const { node, isPropertyDragOver } = props;
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: [QUERY_BUILDER_PARAMETER_TREE_DND_TYPE.VARIABLE],
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): { isFilterValueDragOver: boolean } => ({
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 dnd__overlay__container">
500
- {isPropertyDragOver && (
501
- <div className="query-builder-post-filter-tree__node__dnd__overlay">
502
- Add New Logical Group
503
- </div>
504
- )}
505
- <div className="query-builder-post-filter-tree__condition-node">
506
- <div className="query-builder-post-filter-tree__condition-node__property">
507
- <QueryBuilderColumnBadge
508
- postFilterConditionState={node.condition}
509
- onColumnChange={changeColumn}
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
- </div>
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
- isPropertyDragOver: boolean;
533
+ isDragOver: boolean;
578
534
  }) => {
579
- const { isPropertyDragOver } = props;
535
+ const { isDragOver } = props;
580
536
  return (
581
- <div className="query-builder-post-filter-tree__node__label__content dnd__overlay__container">
582
- {isPropertyDragOver && (
583
- <div className="query-builder-post-filter-tree__node__dnd__overlay">
584
- Create Condition
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 === QUERY_BUILDER_PROJECTION_DND_TYPE.PROJECTION_COLUMN) {
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 [{ isPropertyDragOver }, dropConnector] = useDrop(
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
- QUERY_BUILDER_PROJECTION_DND_TYPE.PROJECTION_COLUMN,
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): { isPropertyDragOver: boolean } => ({
687
- isPropertyDragOver: monitor.isOver({ shallow: true }),
646
+ collect: (monitor) => ({
647
+ isDragOver: monitor.isOver({ shallow: true }),
688
648
  }),
689
649
  }),
690
650
  [handleDrop],
691
651
  );
692
652
 
693
- const [, dragConnector, dragPreviewConnector] = useDrag(
694
- () => ({
695
- type:
696
- node instanceof QueryBuilderPostFilterTreeGroupNodeData
697
- ? QUERY_BUILDER_POST_FILTER_DND_TYPE.GROUP_CONDITION
698
- : node instanceof QueryBuilderPostFilterTreeConditionNodeData
699
- ? QUERY_BUILDER_POST_FILTER_DND_TYPE.CONDITION
700
- : QUERY_BUILDER_POST_FILTER_DND_TYPE.BLANK_CONDITION,
701
- item: (): QueryBuilderPostFilterConditionDragSource => ({ node }),
702
- end: (): void => postFilterState.setRearrangingConditions(false),
703
- }),
704
- [node, postFilterState],
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
- // hide default HTML5 preview image
708
- useEffect(() => {
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
- isPropertyDragOver={isPropertyDragOver}
728
+ isDragOver={isDragOver}
770
729
  />
771
730
  )}
772
731
  {node instanceof QueryBuilderPostFilterTreeConditionNodeData && (
773
732
  <QueryBuilderPostFilterConditionEditor
774
733
  node={node}
775
- isPropertyDragOver={isPropertyDragOver}
734
+ isDragOver={isDragOver}
776
735
  />
777
736
  )}
778
737
  {node instanceof
779
738
  QueryBuilderPostFilterTreeBlankConditionNodeData && (
780
739
  <QueryBuilderPostFilterBlankConditionEditor
781
740
  node={node}
782
- isPropertyDragOver={isPropertyDragOver}
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 [{ isPropertyDragOver }, dropConnector] = useDrop(
949
+ const [{ isDragOver }, dropTargetConnector] = useDrop<
950
+ QueryBuilderProjectionColumnDragSource,
951
+ void,
952
+ { isDragOver: boolean }
953
+ >(
991
954
  () => ({
992
- accept: [QUERY_BUILDER_PROJECTION_DND_TYPE.PROJECTION_COLUMN],
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): { isPropertyDragOver: boolean } => ({
1004
- isPropertyDragOver: monitor.isOver({ shallow: true }),
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
- className="panel__content query-builder__filter__content dnd__overlay__container"
1086
- ref={dropConnector}
1087
- >
1088
- <div className={clsx({ dnd__overlay: isPropertyDragOver })} />
1089
- {postFilterState.isEmpty && (
1090
- <BlankPanelPlaceholder
1091
- placeholderText="Add a post-filter condition"
1092
- tooltipText="Drag and drop properties here"
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
  );