@finos/legend-application-query 5.0.2 → 5.2.2

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 (233) hide show
  1. package/lib/application/LegendQueryApplicationConfig.d.ts +19 -1
  2. package/lib/application/LegendQueryApplicationConfig.d.ts.map +1 -1
  3. package/lib/application/LegendQueryApplicationConfig.js +25 -1
  4. package/lib/application/LegendQueryApplicationConfig.js.map +1 -1
  5. package/lib/components/LegendQueryApplication.d.ts.map +1 -1
  6. package/lib/components/LegendQueryApplication.js +15 -5
  7. package/lib/components/LegendQueryApplication.js.map +1 -1
  8. package/lib/components/LegendQueryBaseStoreProvider.d.ts.map +1 -1
  9. package/lib/components/LegendQueryBaseStoreProvider.js +3 -1
  10. package/lib/components/LegendQueryBaseStoreProvider.js.map +1 -1
  11. package/lib/components/QueryBuilder.d.ts.map +1 -1
  12. package/lib/components/QueryBuilder.js +3 -1
  13. package/lib/components/QueryBuilder.js.map +1 -1
  14. package/lib/components/QueryBuilderExplorerPanel.d.ts.map +1 -1
  15. package/lib/components/QueryBuilderExplorerPanel.js +7 -34
  16. package/lib/components/QueryBuilderExplorerPanel.js.map +1 -1
  17. package/lib/components/QueryBuilderFetchStructurePanel.d.ts.map +1 -1
  18. package/lib/components/QueryBuilderFetchStructurePanel.js +77 -66
  19. package/lib/components/QueryBuilderFetchStructurePanel.js.map +1 -1
  20. package/lib/components/QueryBuilderFilterPanel.d.ts.map +1 -1
  21. package/lib/components/QueryBuilderFilterPanel.js +42 -59
  22. package/lib/components/QueryBuilderFilterPanel.js.map +1 -1
  23. package/lib/components/QueryBuilderFunctionsExplorerPanel.d.ts.map +1 -1
  24. package/lib/components/QueryBuilderFunctionsExplorerPanel.js +9 -39
  25. package/lib/components/QueryBuilderFunctionsExplorerPanel.js.map +1 -1
  26. package/lib/components/QueryBuilderGraphFetchTreePanel.d.ts.map +1 -1
  27. package/lib/components/QueryBuilderGraphFetchTreePanel.js +5 -5
  28. package/lib/components/QueryBuilderGraphFetchTreePanel.js.map +1 -1
  29. package/lib/components/QueryBuilderLambdaEditor.d.ts +1 -0
  30. package/lib/components/QueryBuilderLambdaEditor.d.ts.map +1 -1
  31. package/lib/components/QueryBuilderLambdaEditor.js +2 -2
  32. package/lib/components/QueryBuilderLambdaEditor.js.map +1 -1
  33. package/lib/components/QueryBuilderMilestoneEditor.js +5 -5
  34. package/lib/components/QueryBuilderMilestoneEditor.js.map +1 -1
  35. package/lib/components/QueryBuilderPanelIssueCountBadge.d.ts +20 -0
  36. package/lib/components/QueryBuilderPanelIssueCountBadge.d.ts.map +1 -0
  37. package/lib/components/QueryBuilderPanelIssueCountBadge.js +28 -0
  38. package/lib/components/QueryBuilderPanelIssueCountBadge.js.map +1 -0
  39. package/lib/components/QueryBuilderParameterPanel.d.ts.map +1 -1
  40. package/lib/components/QueryBuilderParameterPanel.js +13 -33
  41. package/lib/components/QueryBuilderParameterPanel.js.map +1 -1
  42. package/lib/components/QueryBuilderPostFilterPanel.d.ts.map +1 -1
  43. package/lib/components/QueryBuilderPostFilterPanel.js +47 -59
  44. package/lib/components/QueryBuilderPostFilterPanel.js.map +1 -1
  45. package/lib/components/QueryBuilderProjectionPanel.d.ts.map +1 -1
  46. package/lib/components/QueryBuilderProjectionPanel.js +47 -63
  47. package/lib/components/QueryBuilderProjectionPanel.js.map +1 -1
  48. package/lib/components/QueryBuilderPropertyExpressionEditor.d.ts.map +1 -1
  49. package/lib/components/QueryBuilderPropertyExpressionEditor.js +11 -11
  50. package/lib/components/QueryBuilderPropertyExpressionEditor.js.map +1 -1
  51. package/lib/components/QueryBuilderPropertySearchPanel.d.ts.map +1 -1
  52. package/lib/components/QueryBuilderPropertySearchPanel.js +3 -6
  53. package/lib/components/QueryBuilderPropertySearchPanel.js.map +1 -1
  54. package/lib/components/QueryBuilderResultModifierPanel.d.ts.map +1 -1
  55. package/lib/components/QueryBuilderResultModifierPanel.js +3 -1
  56. package/lib/components/QueryBuilderResultModifierPanel.js.map +1 -1
  57. package/lib/components/QueryBuilderResultPanel.d.ts.map +1 -1
  58. package/lib/components/QueryBuilderResultPanel.js +28 -18
  59. package/lib/components/QueryBuilderResultPanel.js.map +1 -1
  60. package/lib/components/QueryBuilderSetupPanel.d.ts.map +1 -1
  61. package/lib/components/QueryBuilderSetupPanel.js +10 -9
  62. package/lib/components/QueryBuilderSetupPanel.js.map +1 -1
  63. package/lib/components/QueryBuilderUnsupportedQueryEditor.d.ts.map +1 -1
  64. package/lib/components/QueryBuilderUnsupportedQueryEditor.js +4 -2
  65. package/lib/components/QueryBuilderUnsupportedQueryEditor.js.map +1 -1
  66. package/lib/components/QueryEditor.d.ts.map +1 -1
  67. package/lib/components/QueryEditor.js +16 -4
  68. package/lib/components/QueryEditor.js.map +1 -1
  69. package/lib/components/QueryEditorComponentTestUtils.d.ts +2 -0
  70. package/lib/components/QueryEditorComponentTestUtils.d.ts.map +1 -1
  71. package/lib/components/QueryEditorComponentTestUtils.js +3 -2
  72. package/lib/components/QueryEditorComponentTestUtils.js.map +1 -1
  73. package/lib/components/QueryEditorStoreProvider.d.ts.map +1 -1
  74. package/lib/components/QueryEditorStoreProvider.js +7 -3
  75. package/lib/components/QueryEditorStoreProvider.js.map +1 -1
  76. package/lib/components/QuerySetupStoreProvider.d.ts.map +1 -1
  77. package/lib/components/QuerySetupStoreProvider.js +3 -1
  78. package/lib/components/QuerySetupStoreProvider.js.map +1 -1
  79. package/lib/index.css +2 -2
  80. package/lib/index.css.map +1 -1
  81. package/lib/package.json +11 -9
  82. package/lib/stores/LegendQueryBaseStore.d.ts +4 -2
  83. package/lib/stores/LegendQueryBaseStore.d.ts.map +1 -1
  84. package/lib/stores/LegendQueryBaseStore.js +5 -1
  85. package/lib/stores/LegendQueryBaseStore.js.map +1 -1
  86. package/lib/stores/QueryBuilderExplorerState.d.ts.map +1 -1
  87. package/lib/stores/QueryBuilderExplorerState.js +5 -0
  88. package/lib/stores/QueryBuilderExplorerState.js.map +1 -1
  89. package/lib/stores/QueryBuilderFetchStructureState.d.ts +8 -1
  90. package/lib/stores/QueryBuilderFetchStructureState.d.ts.map +1 -1
  91. package/lib/stores/QueryBuilderFetchStructureState.js +10 -2
  92. package/lib/stores/QueryBuilderFetchStructureState.js.map +1 -1
  93. package/lib/stores/QueryBuilderFilterState.d.ts +8 -9
  94. package/lib/stores/QueryBuilderFilterState.d.ts.map +1 -1
  95. package/lib/stores/QueryBuilderFilterState.js +34 -13
  96. package/lib/stores/QueryBuilderFilterState.js.map +1 -1
  97. package/lib/stores/QueryBuilderGraphFetchTreeState.d.ts.map +1 -1
  98. package/lib/stores/QueryBuilderGraphFetchTreeState.js +6 -3
  99. package/lib/stores/QueryBuilderGraphFetchTreeState.js.map +1 -1
  100. package/lib/stores/QueryBuilderLambdaProcessor.d.ts.map +1 -1
  101. package/lib/stores/QueryBuilderLambdaProcessor.js +2 -0
  102. package/lib/stores/QueryBuilderLambdaProcessor.js.map +1 -1
  103. package/lib/stores/QueryBuilderOperatorLoader.d.ts +47 -0
  104. package/lib/stores/QueryBuilderOperatorLoader.d.ts.map +1 -0
  105. package/lib/stores/QueryBuilderOperatorLoader.js +94 -0
  106. package/lib/stores/QueryBuilderOperatorLoader.js.map +1 -0
  107. package/lib/stores/QueryBuilderPostFilterState.d.ts +9 -6
  108. package/lib/stores/QueryBuilderPostFilterState.d.ts.map +1 -1
  109. package/lib/stores/QueryBuilderPostFilterState.js +31 -7
  110. package/lib/stores/QueryBuilderPostFilterState.js.map +1 -1
  111. package/lib/stores/QueryBuilderPreviewDataHelper.d.ts +4 -3
  112. package/lib/stores/QueryBuilderPreviewDataHelper.d.ts.map +1 -1
  113. package/lib/stores/QueryBuilderPreviewDataHelper.js +77 -97
  114. package/lib/stores/QueryBuilderPreviewDataHelper.js.map +1 -1
  115. package/lib/stores/QueryBuilderProjectionState.d.ts +4 -8
  116. package/lib/stores/QueryBuilderProjectionState.d.ts.map +1 -1
  117. package/lib/stores/QueryBuilderProjectionState.js +17 -44
  118. package/lib/stores/QueryBuilderProjectionState.js.map +1 -1
  119. package/lib/stores/QueryBuilderSetupState.js +1 -1
  120. package/lib/stores/QueryBuilderSetupState.js.map +1 -1
  121. package/lib/stores/QueryBuilderState.d.ts +7 -1
  122. package/lib/stores/QueryBuilderState.d.ts.map +1 -1
  123. package/lib/stores/QueryBuilderState.js +17 -60
  124. package/lib/stores/QueryBuilderState.js.map +1 -1
  125. package/lib/stores/QueryBuilderTestUtils.d.ts +24 -0
  126. package/lib/stores/QueryBuilderTestUtils.d.ts.map +1 -0
  127. package/lib/stores/QueryBuilderTestUtils.js +49 -0
  128. package/lib/stores/QueryBuilderTestUtils.js.map +1 -0
  129. package/lib/stores/QueryBuilderTypeaheadHelper.d.ts +24 -0
  130. package/lib/stores/QueryBuilderTypeaheadHelper.d.ts.map +1 -0
  131. package/lib/stores/QueryBuilderTypeaheadHelper.js +89 -0
  132. package/lib/stores/QueryBuilderTypeaheadHelper.js.map +1 -0
  133. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.d.ts.map +1 -1
  134. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.js +7 -7
  135. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.js.map +1 -1
  136. package/lib/stores/QueryEditorStore.d.ts +6 -4
  137. package/lib/stores/QueryEditorStore.d.ts.map +1 -1
  138. package/lib/stores/QueryEditorStore.js +23 -10
  139. package/lib/stores/QueryEditorStore.js.map +1 -1
  140. package/lib/stores/QueryEditorStoreTestUtils.d.ts.map +1 -1
  141. package/lib/stores/QueryEditorStoreTestUtils.js +1 -0
  142. package/lib/stores/QueryEditorStoreTestUtils.js.map +1 -1
  143. package/lib/stores/QueryFunctionsExplorerState.d.ts +2 -6
  144. package/lib/stores/QueryFunctionsExplorerState.d.ts.map +1 -1
  145. package/lib/stores/QueryFunctionsExplorerState.js +2 -11
  146. package/lib/stores/QueryFunctionsExplorerState.js.map +1 -1
  147. package/lib/stores/QueryParametersState.d.ts +1 -3
  148. package/lib/stores/QueryParametersState.d.ts.map +1 -1
  149. package/lib/stores/QueryParametersState.js +1 -4
  150. package/lib/stores/QueryParametersState.js.map +1 -1
  151. package/lib/stores/QuerySetupStore.d.ts +3 -1
  152. package/lib/stores/QuerySetupStore.d.ts.map +1 -1
  153. package/lib/stores/QuerySetupStore.js +3 -1
  154. package/lib/stores/QuerySetupStore.js.map +1 -1
  155. package/lib/stores/filterOperators/QueryBuilderFilterOperator_Equal.d.ts.map +1 -1
  156. package/lib/stores/filterOperators/QueryBuilderFilterOperator_Equal.js +4 -1
  157. package/lib/stores/filterOperators/QueryBuilderFilterOperator_Equal.js.map +1 -1
  158. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.d.ts.map +1 -1
  159. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.js +4 -1
  160. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.js.map +1 -1
  161. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.d.ts.map +1 -1
  162. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.js +4 -1
  163. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.js.map +1 -1
  164. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThan.d.ts.map +1 -1
  165. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThan.js +4 -1
  166. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThan.js.map +1 -1
  167. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.d.ts.map +1 -1
  168. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.js +4 -1
  169. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.js.map +1 -1
  170. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.d.ts.map +1 -1
  171. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.js +4 -1
  172. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.js.map +1 -1
  173. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.d.ts.map +1 -1
  174. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.js +4 -1
  175. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.js.map +1 -1
  176. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.d.ts.map +1 -1
  177. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.js +4 -1
  178. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.js.map +1 -1
  179. package/package.json +18 -16
  180. package/src/application/LegendQueryApplicationConfig.ts +41 -2
  181. package/src/components/LegendQueryApplication.tsx +27 -10
  182. package/src/components/LegendQueryBaseStoreProvider.tsx +3 -0
  183. package/src/components/QueryBuilder.tsx +13 -2
  184. package/src/components/QueryBuilderExplorerPanel.tsx +17 -56
  185. package/src/components/QueryBuilderFetchStructurePanel.tsx +93 -77
  186. package/src/components/QueryBuilderFilterPanel.tsx +205 -219
  187. package/src/components/QueryBuilderFunctionsExplorerPanel.tsx +24 -68
  188. package/src/components/QueryBuilderGraphFetchTreePanel.tsx +34 -25
  189. package/src/components/QueryBuilderLambdaEditor.tsx +3 -0
  190. package/src/components/QueryBuilderMilestoneEditor.tsx +34 -34
  191. package/src/components/QueryBuilderPanelIssueCountBadge.tsx +38 -0
  192. package/src/components/QueryBuilderParameterPanel.tsx +23 -55
  193. package/src/components/QueryBuilderPostFilterPanel.tsx +223 -230
  194. package/src/components/QueryBuilderProjectionPanel.tsx +127 -154
  195. package/src/components/QueryBuilderPropertyExpressionEditor.tsx +61 -57
  196. package/src/components/QueryBuilderPropertySearchPanel.tsx +8 -9
  197. package/src/components/QueryBuilderResultModifierPanel.tsx +4 -2
  198. package/src/components/QueryBuilderResultPanel.tsx +75 -50
  199. package/src/components/QueryBuilderSetupPanel.tsx +13 -12
  200. package/src/components/QueryBuilderUnsupportedQueryEditor.tsx +4 -2
  201. package/src/components/QueryEditor.tsx +39 -1
  202. package/src/components/QueryEditorComponentTestUtils.tsx +15 -5
  203. package/src/components/QueryEditorStoreProvider.tsx +7 -0
  204. package/src/components/QuerySetupStoreProvider.tsx +3 -0
  205. package/src/stores/LegendQueryBaseStore.ts +14 -1
  206. package/src/stores/QueryBuilderExplorerState.ts +5 -0
  207. package/src/stores/QueryBuilderFetchStructureState.ts +18 -2
  208. package/src/stores/QueryBuilderFilterState.ts +50 -12
  209. package/src/stores/QueryBuilderGraphFetchTreeState.ts +14 -8
  210. package/src/stores/QueryBuilderLambdaProcessor.ts +8 -0
  211. package/src/stores/QueryBuilderOperatorLoader.ts +133 -0
  212. package/src/stores/QueryBuilderPostFilterState.ts +47 -8
  213. package/src/stores/QueryBuilderPreviewDataHelper.ts +122 -217
  214. package/src/stores/QueryBuilderProjectionState.ts +30 -58
  215. package/src/stores/QueryBuilderSetupState.ts +1 -1
  216. package/src/stores/QueryBuilderState.ts +33 -96
  217. package/src/stores/QueryBuilderTestUtils.ts +93 -0
  218. package/src/stores/QueryBuilderTypeaheadHelper.ts +149 -0
  219. package/src/stores/QueryBuilderValueSpecificationBuilderHelper.ts +9 -7
  220. package/src/stores/QueryEditorStore.ts +29 -6
  221. package/src/stores/QueryEditorStoreTestUtils.ts +1 -0
  222. package/src/stores/QueryFunctionsExplorerState.ts +1 -11
  223. package/src/stores/QueryParametersState.ts +1 -3
  224. package/src/stores/QuerySetupStore.ts +4 -0
  225. package/src/stores/filterOperators/QueryBuilderFilterOperator_Equal.ts +8 -1
  226. package/src/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.ts +8 -1
  227. package/src/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.ts +8 -1
  228. package/src/stores/filterOperators/QueryBuilderFilterOperator_LessThan.ts +8 -1
  229. package/src/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.ts +8 -1
  230. package/src/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.ts +8 -1
  231. package/src/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.ts +8 -1
  232. package/src/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.ts +8 -1
  233. package/tsconfig.json +4 -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,
@@ -61,17 +65,12 @@ import {
61
65
  assertErrorThrown,
62
66
  guaranteeNonNullable,
63
67
  returnUndefOnError,
68
+ debounce,
64
69
  } from '@finos/legend-shared';
65
70
  import { flowResult } from 'mobx';
66
71
  import { observer } from 'mobx-react-lite';
67
- import { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
68
- import {
69
- type DropTargetMonitor,
70
- useDragLayer,
71
- useDrop,
72
- useDrag,
73
- } from 'react-dnd';
74
- import { getEmptyImage } from 'react-dnd-html5-backend';
72
+ import { forwardRef, useCallback, useMemo, useRef, useState } from 'react';
73
+ import { useDrop, useDrag } from 'react-dnd';
75
74
  import { getColumnMultiplicity } from '../stores/postFilterOperators/QueryBuilderPostFilterOperatorHelper.js';
76
75
  import { QueryBuilderAggregateColumnState } from '../stores/QueryBuilderAggregationState.js';
77
76
  import {
@@ -92,55 +91,16 @@ import {
92
91
  import {
93
92
  type QueryBuilderProjectionColumnState,
94
93
  type QueryBuilderProjectionColumnDragSource,
95
- QUERY_BUILDER_PROJECTION_DND_TYPE,
94
+ QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE,
96
95
  QueryBuilderDerivationProjectionColumnState,
97
96
  } from '../stores/QueryBuilderProjectionState.js';
98
97
  import type { QueryBuilderState } from '../stores/QueryBuilderState.js';
99
98
  import {
100
99
  type QueryBuilderParameterDragSource,
101
- QUERY_BUILDER_PARAMETER_TREE_DND_TYPE,
100
+ QUERY_BUILDER_PARAMETER_DND_TYPE,
102
101
  } from '../stores/QueryParametersState.js';
103
102
  import { QUERY_BUILDER_TEST_ID } from './QueryBuilder_TestID.js';
104
103
 
105
- const PostFilterConditionDragLayer: React.FC = () => {
106
- const { itemType, item, isDragging, currentPosition } = useDragLayer(
107
- (monitor) => ({
108
- itemType: monitor.getItemType() as QUERY_BUILDER_POST_FILTER_DND_TYPE,
109
- item: monitor.getItem<QueryBuilderPostFilterConditionDragSource | null>(),
110
- isDragging: monitor.isDragging(),
111
- initialOffset: monitor.getInitialSourceClientOffset(),
112
- currentPosition: monitor.getClientOffset(),
113
- }),
114
- );
115
-
116
- if (
117
- !isDragging ||
118
- !item ||
119
- !Object.values(QUERY_BUILDER_POST_FILTER_DND_TYPE).includes(itemType)
120
- ) {
121
- return null;
122
- }
123
- return (
124
- <div className="query-builder-post-filter-tree__drag-preview-layer">
125
- <div
126
- className="query-builder-post-filter-tree__drag-preview"
127
- // added some offset so the mouse doesn't overlap the label too much
128
- style={
129
- !currentPosition
130
- ? { display: 'none' }
131
- : {
132
- transform: `translate(${currentPosition.x + 20}px, ${
133
- currentPosition.y + 10
134
- }px)`,
135
- }
136
- }
137
- >
138
- {item.node.dragLayerLabel}
139
- </div>
140
- </div>
141
- );
142
- };
143
-
144
104
  const QueryBuilderPostFilterConditionContextMenu = observer(
145
105
  forwardRef<
146
106
  HTMLDivElement,
@@ -195,9 +155,9 @@ const QueryBuilderPostFilterConditionContextMenu = observer(
195
155
  const QueryBuilderPostFilterGroupConditionEditor = observer(
196
156
  (props: {
197
157
  node: QueryBuilderPostFilterTreeGroupNodeData;
198
- isPropertyDragOver: boolean;
158
+ isDragOver: boolean;
199
159
  }) => {
200
- const { node, isPropertyDragOver } = props;
160
+ const { node, isDragOver } = props;
201
161
  const switchOperation: React.MouseEventHandler<HTMLDivElement> = (
202
162
  event,
203
163
  ): void => {
@@ -209,29 +169,30 @@ const QueryBuilderPostFilterGroupConditionEditor = observer(
209
169
  );
210
170
  };
211
171
  return (
212
- <div className="query-builder-post-filter-tree__node__label__content dnd__overlay__container">
213
- {isPropertyDragOver && (
214
- <div className="query-builder-post-filter-tree__node__dnd__overlay">
215
- Add to Logical Group
216
- </div>
217
- )}
218
- <div
219
- className={clsx('query-builder-post-filter-tree__group-node', {
220
- 'query-builder-post-filter-tree__group-node--and':
221
- node.groupOperation === QUERY_BUILDER_GROUP_OPERATION.AND,
222
- 'query-builder-post-filter-tree__group-node--or':
223
- node.groupOperation === QUERY_BUILDER_GROUP_OPERATION.OR,
224
- })}
225
- title="Switch Operation"
226
- 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"
227
177
  >
228
- <div className="query-builder-post-filter-tree__group-node__label">
229
- {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>
230
194
  </div>
231
- <button className="query-builder-post-filter-tree__group-node__action">
232
- <FilledTriangleIcon />
233
- </button>
234
- </div>
195
+ </PanelEntryDropZonePlaceholder>
235
196
  </div>
236
197
  );
237
198
  },
@@ -336,22 +297,23 @@ export const QueryBuilderColumnBadge = observer(
336
297
  onColumnChange(item.columnState),
337
298
  [onColumnChange],
338
299
  );
339
- const [{ isPropertyDragOver }, dropConnector] = useDrop(
300
+ const [{ isDragOver }, dropConnector] = useDrop<
301
+ QueryBuilderProjectionColumnDragSource,
302
+ void,
303
+ { isDragOver: boolean }
304
+ >(
340
305
  () => ({
341
- accept: [QUERY_BUILDER_PROJECTION_DND_TYPE.PROJECTION_COLUMN],
342
- drop: (
343
- item: QueryBuilderProjectionColumnDragSource,
344
- monitor: DropTargetMonitor,
345
- ): void => {
306
+ accept: [QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE],
307
+ drop: (item, monitor): void => {
346
308
  if (!monitor.didDrop()) {
347
309
  handleDrop(item).catch(
348
310
  postFilterConditionState.postFilterState.queryBuilderState
349
311
  .applicationStore.alertUnhandledError,
350
312
  );
351
- }
313
+ } // prevent drop event propagation to accomondate for nested DnD
352
314
  },
353
- collect: (monitor): { isPropertyDragOver: boolean } => ({
354
- isPropertyDragOver: monitor.isOver({ shallow: true }),
315
+ collect: (monitor) => ({
316
+ isDragOver: monitor.isOver({ shallow: true }),
355
317
  }),
356
318
  }),
357
319
  [handleDrop],
@@ -359,12 +321,11 @@ export const QueryBuilderColumnBadge = observer(
359
321
 
360
322
  return (
361
323
  <div ref={dropConnector} className="query-builder-column-badge">
362
- {isPropertyDragOver && (
363
- <div className="query-builder__dnd__placeholder query-builder-column-badge__dnd__placeholder">
364
- Change Property
365
- </div>
366
- )}
367
- {!isPropertyDragOver && (
324
+ <PanelEntryDropZonePlaceholder
325
+ showPlaceholder={isDragOver}
326
+ label="Change Property"
327
+ className="query-builder__dnd__placeholder"
328
+ >
368
329
  <div className="query-builder-column-badge__content">
369
330
  {type && (
370
331
  <div
@@ -395,7 +356,7 @@ export const QueryBuilderColumnBadge = observer(
395
356
  </div>
396
357
  </QueryBuilderColumnInfoTooltip>
397
358
  </div>
398
- )}
359
+ </PanelEntryDropZonePlaceholder>
399
360
  </div>
400
361
  );
401
362
  },
@@ -403,9 +364,9 @@ export const QueryBuilderColumnBadge = observer(
403
364
  const QueryBuilderPostFilterConditionEditor = observer(
404
365
  (props: {
405
366
  node: QueryBuilderPostFilterTreeConditionNodeData;
406
- isPropertyDragOver: boolean;
367
+ isDragOver: boolean;
407
368
  }) => {
408
- const { node, isPropertyDragOver } = props;
369
+ const { node, isDragOver } = props;
409
370
  const graph =
410
371
  node.condition.postFilterState.queryBuilderState.graphManagerState.graph;
411
372
  const applicationStore = useApplicationStore();
@@ -444,18 +405,19 @@ const QueryBuilderPostFilterConditionEditor = observer(
444
405
  },
445
406
  [applicationStore, node.condition],
446
407
  );
447
- const [{ isFilterValueDragOver }, dropConnector] = useDrop(
408
+ const [{ isFilterValueDragOver }, dropConnector] = useDrop<
409
+ QueryBuilderParameterDragSource,
410
+ void,
411
+ { isFilterValueDragOver: boolean }
412
+ >(
448
413
  () => ({
449
- accept: [QUERY_BUILDER_PARAMETER_TREE_DND_TYPE.VARIABLE],
450
- drop: (
451
- item: QueryBuilderParameterDragSource,
452
- monitor: DropTargetMonitor,
453
- ): void => {
414
+ accept: [QUERY_BUILDER_PARAMETER_DND_TYPE],
415
+ drop: (item, monitor): void => {
454
416
  if (!monitor.didDrop()) {
455
417
  handleDrop(item);
456
- }
418
+ } // prevent drop event propagation to accomondate for nested DnD
457
419
  },
458
- collect: (monitor): { isFilterValueDragOver: boolean } => ({
420
+ collect: (monitor) => ({
459
421
  isFilterValueDragOver: monitor.isOver({ shallow: true }),
460
422
  }),
461
423
  }),
@@ -466,79 +428,100 @@ const QueryBuilderPostFilterConditionEditor = observer(
466
428
  node.condition.operator.getDefaultFilterConditionValue(node.condition),
467
429
  );
468
430
  };
431
+ const debouncedTypeaheadSearch = useMemo(
432
+ () =>
433
+ debounce(
434
+ (inputVal: string) => node.condition.handleTypeaheadSearch(),
435
+ 1000,
436
+ ),
437
+ [node],
438
+ );
439
+ const cleanUpReloadValues = (): void => {
440
+ node.condition.typeaheadSearchState.complete();
441
+ };
442
+ const changeValueSpecification = (val: ValueSpecification): void => {
443
+ node.condition.setValue(val);
444
+ };
445
+ const selectorConfig = {
446
+ values: node.condition.typeaheadSearchResults,
447
+ isLoading: node.condition.typeaheadSearchState.isInProgress,
448
+ reloadValues: debouncedTypeaheadSearch,
449
+ cleanUpReloadValues,
450
+ };
469
451
 
470
452
  return (
471
- <div className="query-builder-post-filter-tree__node__label__content dnd__overlay__container">
472
- {isPropertyDragOver && (
473
- <div className="query-builder-post-filter-tree__node__dnd__overlay">
474
- Add New Logical Group
475
- </div>
476
- )}
477
- <div className="query-builder-post-filter-tree__condition-node">
478
- <div className="query-builder-post-filter-tree__condition-node__property">
479
- <QueryBuilderColumnBadge
480
- postFilterConditionState={node.condition}
481
- onColumnChange={changeColumn}
482
- />
483
- </div>
484
- <DropdownMenu
485
- className="query-builder-post-filter-tree__condition-node__operator"
486
- content={
487
- <MenuContent>
488
- {node.condition.operators.map((op) => (
489
- <MenuContentItem
490
- key={op.uuid}
491
- className="query-builder-post-filter-tree__condition-node__operator__dropdown__option"
492
- onClick={changeOperator(op)}
493
- >
494
- {op.getLabel()}
495
- </MenuContentItem>
496
- ))}
497
- </MenuContent>
498
- }
499
- menuProps={{
500
- anchorOrigin: { vertical: 'bottom', horizontal: 'left' },
501
- transformOrigin: { vertical: 'top', horizontal: 'left' },
502
- elevation: 7,
503
- }}
504
- >
505
- <div className="query-builder-post-filter-tree__condition-node__operator__label">
506
- {node.condition.operator.getLabel()}
507
- </div>
508
- <button
509
- className="query-builder-post-filter-tree__condition-node__operator__dropdown__trigger"
510
- tabIndex={-1}
511
- title="Choose Operator..."
512
- >
513
- <CaretDownIcon />
514
- </button>
515
- </DropdownMenu>
516
- {node.condition.value && (
517
- <div
518
- ref={dropConnector}
519
- className="query-builder-post-filter-tree__condition-node__value dnd__overlay__container"
520
- >
521
- {isFilterValueDragOver && (
522
- <div className="query-builder-post-filter-tree__node__dnd__overlay">
523
- Change Filter Value
524
- </div>
525
- )}
526
- <BasicValueSpecificationEditor
527
- valueSpecification={node.condition.value}
528
- setValueSpecification={(val: ValueSpecification): void =>
529
- node.condition.setValue(val)
530
- }
531
- graph={graph}
532
- typeCheckOption={{
533
- expectedType: guaranteeNonNullable(
534
- node.condition.columnState.getReturnType(),
535
- ),
536
- }}
537
- resetValue={resetNode}
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}
538
464
  />
539
465
  </div>
540
- )}
541
- </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>
542
525
  </div>
543
526
  );
544
527
  },
@@ -547,17 +530,20 @@ const QueryBuilderPostFilterConditionEditor = observer(
547
530
  const QueryBuilderPostFilterBlankConditionEditor = observer(
548
531
  (props: {
549
532
  node: QueryBuilderPostFilterTreeBlankConditionNodeData;
550
- isPropertyDragOver: boolean;
533
+ isDragOver: boolean;
551
534
  }) => {
552
- const { isPropertyDragOver } = props;
535
+ const { isDragOver } = props;
553
536
  return (
554
- <div className="query-builder-post-filter-tree__node__label__content dnd__overlay__container">
555
- {isPropertyDragOver && (
556
- <div className="query-builder-post-filter-tree__node__dnd__overlay">
557
- 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
558
545
  </div>
559
- )}
560
- <div className="query-builder-post-filter-tree__blank-node">blank</div>
546
+ </PanelEntryDropZonePlaceholder>
561
547
  </div>
562
548
  );
563
549
  },
@@ -587,7 +573,7 @@ const QueryBuilderPostFilterTreeNodeContainer = observer(
587
573
  postFilterState.removeNodeAndPruneBranch(node);
588
574
  const handleDrop = useCallback(
589
575
  (item: QueryBuilderPostFilterDropTarget, type: string): void => {
590
- if (type === QUERY_BUILDER_PROJECTION_DND_TYPE.PROJECTION_COLUMN) {
576
+ if (type === QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE) {
591
577
  const columnState = (item as QueryBuilderProjectionColumnDragSource)
592
578
  .columnState;
593
579
  let conditionState: PostFilterConditionState;
@@ -642,45 +628,45 @@ const QueryBuilderPostFilterTreeNodeContainer = observer(
642
628
  },
643
629
  [applicationStore, postFilterState, node],
644
630
  );
645
- const [{ isPropertyDragOver }, dropConnector] = useDrop(
631
+ const [{ isDragOver }, dropConnector] = useDrop<
632
+ QueryBuilderPostFilterConditionDragSource,
633
+ void,
634
+ { isDragOver: boolean }
635
+ >(
646
636
  () => ({
647
637
  accept: [
648
638
  ...Object.values(QUERY_BUILDER_POST_FILTER_DND_TYPE),
649
- QUERY_BUILDER_PROJECTION_DND_TYPE.PROJECTION_COLUMN,
639
+ QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE,
650
640
  ],
651
- drop: (
652
- item: QueryBuilderPostFilterConditionDragSource,
653
- monitor: DropTargetMonitor,
654
- ): void => {
641
+ drop: (item, monitor): void => {
655
642
  if (!monitor.didDrop()) {
656
643
  handleDrop(item, monitor.getItemType() as string);
657
644
  } // prevent drop event propagation to accomondate for nested DnD
658
645
  },
659
- collect: (monitor): { isPropertyDragOver: boolean } => ({
660
- isPropertyDragOver: monitor.isOver({ shallow: true }),
646
+ collect: (monitor) => ({
647
+ isDragOver: monitor.isOver({ shallow: true }),
661
648
  }),
662
649
  }),
663
650
  [handleDrop],
664
651
  );
665
652
 
666
- const [, dragConnector, dragPreviewConnector] = useDrag(
667
- () => ({
668
- type:
669
- node instanceof QueryBuilderPostFilterTreeGroupNodeData
670
- ? QUERY_BUILDER_POST_FILTER_DND_TYPE.GROUP_CONDITION
671
- : node instanceof QueryBuilderPostFilterTreeConditionNodeData
672
- ? QUERY_BUILDER_POST_FILTER_DND_TYPE.CONDITION
673
- : QUERY_BUILDER_POST_FILTER_DND_TYPE.BLANK_CONDITION,
674
- item: (): QueryBuilderPostFilterConditionDragSource => ({ node }),
675
- end: (): void => postFilterState.setRearrangingConditions(false),
676
- }),
677
- [node, postFilterState],
678
- );
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
+ );
679
667
  dragConnector(dropConnector(ref));
680
- // hide default HTML5 preview image
681
- useEffect(() => {
682
- dragPreviewConnector(getEmptyImage(), { captureDraggingState: true });
683
- }, [dragPreviewConnector]);
668
+ useDragPreviewLayer(dragPreviewConnector);
669
+
684
670
  // context menu
685
671
  const onContextMenuOpen = (): void => setIsSelectedFromContextMenu(true);
686
672
  const onContextMenuClose = (): void => setIsSelectedFromContextMenu(false);
@@ -739,20 +725,20 @@ const QueryBuilderPostFilterTreeNodeContainer = observer(
739
725
  {node instanceof QueryBuilderPostFilterTreeGroupNodeData && (
740
726
  <QueryBuilderPostFilterGroupConditionEditor
741
727
  node={node}
742
- isPropertyDragOver={isPropertyDragOver}
728
+ isDragOver={isDragOver}
743
729
  />
744
730
  )}
745
731
  {node instanceof QueryBuilderPostFilterTreeConditionNodeData && (
746
732
  <QueryBuilderPostFilterConditionEditor
747
733
  node={node}
748
- isPropertyDragOver={isPropertyDragOver}
734
+ isDragOver={isDragOver}
749
735
  />
750
736
  )}
751
737
  {node instanceof
752
738
  QueryBuilderPostFilterTreeBlankConditionNodeData && (
753
739
  <QueryBuilderPostFilterBlankConditionEditor
754
740
  node={node}
755
- isPropertyDragOver={isPropertyDragOver}
741
+ isDragOver={isDragOver}
756
742
  />
757
743
  )}
758
744
  </div>
@@ -960,21 +946,22 @@ export const QueryBuilderPostFilterPanel = observer(
960
946
  .columns,
961
947
  ],
962
948
  );
963
- const [{ isPropertyDragOver }, dropConnector] = useDrop(
949
+ const [{ isDragOver }, dropTargetConnector] = useDrop<
950
+ QueryBuilderProjectionColumnDragSource,
951
+ void,
952
+ { isDragOver: boolean }
953
+ >(
964
954
  () => ({
965
- accept: [QUERY_BUILDER_PROJECTION_DND_TYPE.PROJECTION_COLUMN],
966
- drop: (
967
- item: QueryBuilderProjectionColumnDragSource,
968
- monitor: DropTargetMonitor,
969
- ): void => {
955
+ accept: [QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE],
956
+ drop: (item, monitor): void => {
970
957
  if (!monitor.didDrop()) {
971
958
  handleDrop(item).catch(
972
959
  queryBuilderState.applicationStore.alertUnhandledError,
973
960
  );
974
961
  } // prevent drop event propagation to accomondate for nested DnD
975
962
  },
976
- collect: (monitor): { isPropertyDragOver: boolean } => ({
977
- isPropertyDragOver: monitor.isOver({ shallow: true }),
963
+ collect: (monitor) => ({
964
+ isDragOver: monitor.isOver({ shallow: true }),
978
965
  }),
979
966
  }),
980
967
  [handleDrop],
@@ -1054,25 +1041,31 @@ export const QueryBuilderPostFilterPanel = observer(
1054
1041
  </button>
1055
1042
  </div>
1056
1043
  </div>
1057
- <div
1058
- className="panel__content query-builder__filter__content dnd__overlay__container"
1059
- ref={dropConnector}
1060
- >
1061
- <div className={clsx({ dnd__overlay: isPropertyDragOver })} />
1062
- {postFilterState.isEmpty && (
1063
- <BlankPanelPlaceholder
1064
- placeholderText="Add a post-filter condition"
1065
- tooltipText="Drag and drop properties here"
1066
- />
1067
- )}
1068
- {!postFilterState.isEmpty && (
1069
- <>
1070
- <PostFilterConditionDragLayer />
1071
- <QueryBuilderPostFilterTree
1072
- 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"
1073
1053
  />
1074
- </>
1075
- )}
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>
1076
1069
  </div>
1077
1070
  </div>
1078
1071
  );