@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
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { useEffect, useRef, useState, useCallback, forwardRef } from 'react';
17
+ import { useRef, useState, useCallback, forwardRef, useMemo } from 'react';
18
18
  import { observer } from 'mobx-react-lite';
19
19
  import {
20
20
  type TreeNodeContainerProps,
@@ -38,6 +38,10 @@ import {
38
38
  ChevronRightIcon,
39
39
  PlusCircleIcon,
40
40
  TimesIcon,
41
+ PanelDropZone,
42
+ DragPreviewLayer,
43
+ PanelEntryDropZonePlaceholder,
44
+ useDragPreviewLayer,
41
45
  } from '@finos/legend-art';
42
46
  import {
43
47
  type QueryBuilderFilterConditionDragSource,
@@ -50,13 +54,7 @@ import {
50
54
  QueryBuilderFilterTreeBlankConditionNodeData,
51
55
  QueryBuilderFilterTreeGroupNodeData,
52
56
  } from '../stores/QueryBuilderFilterState.js';
53
- import {
54
- type DropTargetMonitor,
55
- useDragLayer,
56
- useDrag,
57
- useDrop,
58
- } from 'react-dnd';
59
- import { getEmptyImage } from 'react-dnd-html5-backend';
57
+ import { useDrag, useDrop } from 'react-dnd';
60
58
  import {
61
59
  type QueryBuilderExplorerTreeDragSource,
62
60
  type QueryBuilderExplorerTreePropertyNodeData,
@@ -67,6 +65,7 @@ import { QueryBuilderPropertyExpressionBadge } from './QueryBuilderPropertyExpre
67
65
  import type { QueryBuilderState } from '../stores/QueryBuilderState.js';
68
66
  import {
69
67
  assertErrorThrown,
68
+ debounce,
70
69
  UnsupportedOperationError,
71
70
  } from '@finos/legend-shared';
72
71
  import { QUERY_BUILDER_TEST_ID } from './QueryBuilder_TestID.js';
@@ -76,7 +75,7 @@ import {
76
75
  } from '@finos/legend-application';
77
76
  import {
78
77
  type QueryBuilderParameterDragSource,
79
- QUERY_BUILDER_PARAMETER_TREE_DND_TYPE,
78
+ QUERY_BUILDER_PARAMETER_DND_TYPE,
80
79
  } from '../stores/QueryParametersState.js';
81
80
  import {
82
81
  isTypeCompatibleWithConditionValueType,
@@ -86,54 +85,15 @@ import type { ValueSpecification } from '@finos/legend-graph';
86
85
  import {
87
86
  type QueryBuilderProjectionColumnDragSource,
88
87
  QueryBuilderSimpleProjectionColumnState,
89
- QUERY_BUILDER_PROJECTION_DND_TYPE,
88
+ QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE,
90
89
  } from '../stores/QueryBuilderProjectionState.js';
91
90
 
92
- const FilterConditionDragLayer: React.FC = () => {
93
- const { itemType, item, isDragging, currentPosition } = useDragLayer(
94
- (monitor) => ({
95
- itemType: monitor.getItemType() as QUERY_BUILDER_FILTER_DND_TYPE,
96
- item: monitor.getItem<QueryBuilderFilterConditionDragSource | null>(),
97
- isDragging: monitor.isDragging(),
98
- initialOffset: monitor.getInitialSourceClientOffset(),
99
- currentPosition: monitor.getClientOffset(),
100
- }),
101
- );
102
-
103
- if (
104
- !isDragging ||
105
- !item ||
106
- !Object.values(QUERY_BUILDER_FILTER_DND_TYPE).includes(itemType)
107
- ) {
108
- return null;
109
- }
110
- return (
111
- <div className="query-builder-filter-tree__drag-preview-layer">
112
- <div
113
- className="query-builder-filter-tree__drag-preview"
114
- // added some offset so the mouse doesn't overlap the label too much
115
- style={
116
- !currentPosition
117
- ? { display: 'none' }
118
- : {
119
- transform: `translate(${currentPosition.x + 20}px, ${
120
- currentPosition.y + 10
121
- }px)`,
122
- }
123
- }
124
- >
125
- {item.node.dragLayerLabel}
126
- </div>
127
- </div>
128
- );
129
- };
130
-
131
91
  const QueryBuilderFilterGroupConditionEditor = observer(
132
92
  (props: {
133
93
  node: QueryBuilderFilterTreeGroupNodeData;
134
- isPropertyDragOver: boolean;
94
+ isDragOver: boolean;
135
95
  }) => {
136
- const { node, isPropertyDragOver } = props;
96
+ const { node, isDragOver } = props;
137
97
  const switchOperation: React.MouseEventHandler<HTMLDivElement> = (
138
98
  event,
139
99
  ): void => {
@@ -145,29 +105,30 @@ const QueryBuilderFilterGroupConditionEditor = observer(
145
105
  );
146
106
  };
147
107
  return (
148
- <div className="query-builder-filter-tree__node__label__content dnd__overlay__container">
149
- {isPropertyDragOver && (
150
- <div className="query-builder-filter-tree__node__dnd__overlay">
151
- Add to Logical Group
152
- </div>
153
- )}
154
- <div
155
- className={clsx('query-builder-filter-tree__group-node', {
156
- 'query-builder-filter-tree__group-node--and':
157
- node.groupOperation === QUERY_BUILDER_GROUP_OPERATION.AND,
158
- 'query-builder-filter-tree__group-node--or':
159
- node.groupOperation === QUERY_BUILDER_GROUP_OPERATION.OR,
160
- })}
161
- title="Switch Operation"
162
- 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"
163
113
  >
164
- <div className="query-builder-filter-tree__group-node__label">
165
- {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>
166
130
  </div>
167
- <button className="query-builder-filter-tree__group-node__action">
168
- <FilledTriangleIcon />
169
- </button>
170
- </div>
131
+ </PanelEntryDropZonePlaceholder>
171
132
  </div>
172
133
  );
173
134
  },
@@ -176,9 +137,9 @@ const QueryBuilderFilterGroupConditionEditor = observer(
176
137
  const QueryBuilderFilterConditionEditor = observer(
177
138
  (props: {
178
139
  node: QueryBuilderFilterTreeConditionNodeData;
179
- isPropertyDragOver: boolean;
140
+ isDragOver: boolean;
180
141
  }) => {
181
- const { node, isPropertyDragOver } = props;
142
+ const { node, isDragOver } = props;
182
143
  const graph =
183
144
  node.condition.filterState.queryBuilderState.graphManagerState.graph;
184
145
  const applicationStore = useApplicationStore();
@@ -220,18 +181,19 @@ const QueryBuilderFilterConditionEditor = observer(
220
181
  },
221
182
  [applicationStore, node.condition],
222
183
  );
223
- const [{ isFilterValueDragOver }, dropConnector] = useDrop(
184
+ const [{ isFilterValueDragOver }, dropConnector] = useDrop<
185
+ QueryBuilderParameterDragSource,
186
+ void,
187
+ { isFilterValueDragOver: boolean }
188
+ >(
224
189
  () => ({
225
- accept: [QUERY_BUILDER_PARAMETER_TREE_DND_TYPE.VARIABLE],
226
- drop: (
227
- item: QueryBuilderParameterDragSource,
228
- monitor: DropTargetMonitor,
229
- ): void => {
190
+ accept: [QUERY_BUILDER_PARAMETER_DND_TYPE],
191
+ drop: (item, monitor): void => {
230
192
  if (!monitor.didDrop()) {
231
193
  handleDrop(item);
232
- }
194
+ } // prevent drop event propagation to accomondate for nested DnD
233
195
  },
234
- collect: (monitor): { isFilterValueDragOver: boolean } => ({
196
+ collect: (monitor) => ({
235
197
  isFilterValueDragOver: monitor.isOver({ shallow: true }),
236
198
  }),
237
199
  }),
@@ -242,79 +204,100 @@ const QueryBuilderFilterConditionEditor = observer(
242
204
  node.condition.operator.getDefaultFilterConditionValue(node.condition),
243
205
  );
244
206
  };
207
+ const debouncedTypeaheadSearch = useMemo(
208
+ () =>
209
+ debounce(
210
+ (inputVal: string) => node.condition.handleTypeaheadSearch(),
211
+ 1000,
212
+ ),
213
+ [node],
214
+ );
215
+ const cleanUpReloadValues = (): void => {
216
+ node.condition.typeaheadSearchState.complete();
217
+ };
218
+ const changeValueSpecification = (val: ValueSpecification): void => {
219
+ node.condition.setValue(val);
220
+ };
221
+ const selectorConfig = {
222
+ values: node.condition.typeaheadSearchResults,
223
+ isLoading: node.condition.typeaheadSearchState.isInProgress,
224
+ reloadValues: debouncedTypeaheadSearch,
225
+ cleanUpReloadValues,
226
+ };
245
227
 
246
228
  return (
247
- <div className="query-builder-filter-tree__node__label__content dnd__overlay__container">
248
- {isPropertyDragOver && (
249
- <div className="query-builder-filter-tree__node__dnd__overlay">
250
- Add New Logical Group
251
- </div>
252
- )}
253
- <div className="query-builder-filter-tree__condition-node">
254
- <div className="query-builder-filter-tree__condition-node__property">
255
- <QueryBuilderPropertyExpressionBadge
256
- propertyExpressionState={node.condition.propertyExpressionState}
257
- onPropertyExpressionChange={changeProperty}
258
- />
259
- </div>
260
- <DropdownMenu
261
- className="query-builder-filter-tree__condition-node__operator"
262
- content={
263
- <MenuContent>
264
- {node.condition.operators.map((op) => (
265
- <MenuContentItem
266
- key={op.uuid}
267
- className="query-builder-filter-tree__condition-node__operator__dropdown__option"
268
- onClick={changeOperator(op)}
269
- >
270
- {op.getLabel(node.condition)}
271
- </MenuContentItem>
272
- ))}
273
- </MenuContent>
274
- }
275
- menuProps={{
276
- anchorOrigin: { vertical: 'bottom', horizontal: 'left' },
277
- transformOrigin: { vertical: 'top', horizontal: 'left' },
278
- elevation: 7,
279
- }}
280
- >
281
- <div className="query-builder-filter-tree__condition-node__operator__label">
282
- {node.condition.operator.getLabel(node.condition)}
283
- </div>
284
- <button
285
- className="query-builder-filter-tree__condition-node__operator__dropdown__trigger"
286
- tabIndex={-1}
287
- title="Choose Operator..."
288
- >
289
- <CaretDownIcon />
290
- </button>
291
- </DropdownMenu>
292
- {node.condition.value && (
293
- <div
294
- ref={dropConnector}
295
- className="query-builder-filter-tree__condition-node__value dnd__overlay__container"
296
- >
297
- {isFilterValueDragOver && (
298
- <div className="query-builder-filter-tree__node__dnd__overlay">
299
- Change Filter Value
300
- </div>
301
- )}
302
- <BasicValueSpecificationEditor
303
- valueSpecification={node.condition.value}
304
- setValueSpecification={(val: ValueSpecification): void =>
305
- node.condition.setValue(val)
306
- }
307
- graph={graph}
308
- typeCheckOption={{
309
- expectedType:
310
- node.condition.propertyExpressionState.propertyExpression
311
- .func.genericType.value.rawType,
312
- }}
313
- resetValue={resetNode}
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}
314
240
  />
315
241
  </div>
316
- )}
317
- </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>
318
301
  </div>
319
302
  );
320
303
  },
@@ -323,17 +306,18 @@ const QueryBuilderFilterConditionEditor = observer(
323
306
  const QueryBuilderFilterBlankConditionEditor = observer(
324
307
  (props: {
325
308
  node: QueryBuilderFilterTreeBlankConditionNodeData;
326
- isPropertyDragOver: boolean;
309
+ isDragOver: boolean;
327
310
  }) => {
328
- const { isPropertyDragOver } = props;
311
+ const { isDragOver } = props;
329
312
  return (
330
- <div className="query-builder-filter-tree__node__label__content dnd__overlay__container">
331
- {isPropertyDragOver && (
332
- <div className="query-builder-filter-tree__node__dnd__overlay">
333
- Create Condition
334
- </div>
335
- )}
336
- <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>
337
321
  </div>
338
322
  );
339
323
  },
@@ -468,50 +452,45 @@ const QueryBuilderFilterTreeNodeContainer = observer(
468
452
  },
469
453
  [applicationStore, filterState, node],
470
454
  );
471
- const [{ isPropertyDragOver }, dropConnector] = useDrop(
455
+ const [{ isDragOver }, dropConnector] = useDrop<
456
+ QueryBuilderFilterConditionDragSource,
457
+ void,
458
+ { isDragOver: boolean }
459
+ >(
472
460
  () => ({
473
461
  accept: [
474
462
  ...Object.values(QUERY_BUILDER_FILTER_DND_TYPE),
475
463
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ENUM_PROPERTY,
476
464
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY,
477
465
  ],
478
- drop: (
479
- item: QueryBuilderFilterConditionDragSource,
480
- monitor: DropTargetMonitor,
481
- ): void => {
466
+ drop: (item, monitor): void => {
482
467
  if (!monitor.didDrop()) {
483
468
  handleDrop(item, monitor.getItemType() as string);
484
469
  } // prevent drop event propagation to accomondate for nested DnD
485
470
  },
486
- // canDrop: (item: QueryBuilderFilterConditionDragSource, monitor: DropTargetMonitor): boolean => {
487
- // // prevent drop inside of children
488
- // // prevent dropping inside my direct ancestor
489
- // return true;
490
- // },
491
- collect: (monitor): { isPropertyDragOver: boolean } => ({
492
- isPropertyDragOver: monitor.isOver({ shallow: true }),
471
+ collect: (monitor) => ({
472
+ isDragOver: monitor.isOver({ shallow: true }),
493
473
  }),
494
474
  }),
495
475
  [handleDrop],
496
476
  );
497
- const [, dragConnector, dragPreviewConnector] = useDrag(
498
- () => ({
499
- type:
500
- node instanceof QueryBuilderFilterTreeGroupNodeData
501
- ? QUERY_BUILDER_FILTER_DND_TYPE.GROUP_CONDITION
502
- : node instanceof QueryBuilderFilterTreeConditionNodeData
503
- ? QUERY_BUILDER_FILTER_DND_TYPE.CONDITION
504
- : QUERY_BUILDER_FILTER_DND_TYPE.BLANK_CONDITION,
505
- item: (): QueryBuilderFilterConditionDragSource => ({ node }),
506
- end: (): void => filterState.setRearrangingConditions(false),
507
- }),
508
- [node, filterState],
509
- );
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
+ );
510
491
  dragConnector(dropConnector(ref));
511
- // hide default HTML5 preview image
512
- useEffect(() => {
513
- dragPreviewConnector(getEmptyImage(), { captureDraggingState: true });
514
- }, [dragPreviewConnector]);
492
+ useDragPreviewLayer(dragPreviewConnector);
493
+
515
494
  // context menu
516
495
  const onContextMenuOpen = (): void => setIsSelectedFromContextMenu(true);
517
496
  const onContextMenuClose = (): void => setIsSelectedFromContextMenu(false);
@@ -570,19 +549,19 @@ const QueryBuilderFilterTreeNodeContainer = observer(
570
549
  {node instanceof QueryBuilderFilterTreeGroupNodeData && (
571
550
  <QueryBuilderFilterGroupConditionEditor
572
551
  node={node}
573
- isPropertyDragOver={isPropertyDragOver}
552
+ isDragOver={isDragOver}
574
553
  />
575
554
  )}
576
555
  {node instanceof QueryBuilderFilterTreeConditionNodeData && (
577
556
  <QueryBuilderFilterConditionEditor
578
557
  node={node}
579
- isPropertyDragOver={isPropertyDragOver}
558
+ isDragOver={isDragOver}
580
559
  />
581
560
  )}
582
561
  {node instanceof QueryBuilderFilterTreeBlankConditionNodeData && (
583
562
  <QueryBuilderFilterBlankConditionEditor
584
563
  node={node}
585
- isPropertyDragOver={isPropertyDragOver}
564
+ isDragOver={isDragOver}
586
565
  />
587
566
  )}
588
567
  </div>
@@ -740,7 +719,7 @@ export const QueryBuilderFilterPanel = observer(
740
719
  let filterConditionState: FilterConditionState;
741
720
  try {
742
721
  let propertyExpression;
743
- if (type === QUERY_BUILDER_PROJECTION_DND_TYPE.PROJECTION_COLUMN) {
722
+ if (type === QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE) {
744
723
  if (
745
724
  (item as QueryBuilderProjectionColumnDragSource)
746
725
  .columnState instanceof QueryBuilderSimpleProjectionColumnState
@@ -785,28 +764,29 @@ export const QueryBuilderFilterPanel = observer(
785
764
  },
786
765
  [applicationStore, filterState],
787
766
  );
788
- const [{ isPropertyDragOver }, dropConnector] = useDrop(
767
+ const [{ isDragOver }, dropTargetConnector] = useDrop<
768
+ QueryBuilderExplorerTreeDragSource,
769
+ void,
770
+ { isDragOver: boolean }
771
+ >(
789
772
  () => ({
790
- accept: filterState.allowDnDProjectionToFilter
773
+ accept: queryBuilderState.mode.isDnDProjectionToFilterSupported
791
774
  ? [
792
775
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ENUM_PROPERTY,
793
776
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY,
794
- QUERY_BUILDER_PROJECTION_DND_TYPE.PROJECTION_COLUMN,
777
+ QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE,
795
778
  ]
796
779
  : [
797
780
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ENUM_PROPERTY,
798
781
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY,
799
782
  ],
800
- drop: (
801
- item: QueryBuilderExplorerTreeDragSource,
802
- monitor: DropTargetMonitor,
803
- ): void => {
783
+ drop: (item, monitor): void => {
804
784
  if (!monitor.didDrop()) {
805
785
  handleDrop(item, monitor.getItemType() as string);
806
786
  } // prevent drop event propagation to accomondate for nested DnD
807
787
  },
808
- collect: (monitor): { isPropertyDragOver: boolean } => ({
809
- isPropertyDragOver: monitor.isOver({ shallow: true }),
788
+ collect: (monitor) => ({
789
+ isDragOver: monitor.isOver({ shallow: true }),
810
790
  }),
811
791
  }),
812
792
  [handleDrop],
@@ -887,23 +867,29 @@ export const QueryBuilderFilterPanel = observer(
887
867
  </button>
888
868
  </div>
889
869
  </div>
890
- <div
891
- className="panel__content query-builder__filter__content dnd__overlay__container"
892
- ref={dropConnector}
893
- >
894
- <div className={clsx({ dnd__overlay: isPropertyDragOver })} />
895
- {filterState.isEmpty && (
896
- <BlankPanelPlaceholder
897
- placeholderText="Add a filter condition"
898
- tooltipText="Drag and drop properties here"
899
- />
900
- )}
901
- {!filterState.isEmpty && (
902
- <>
903
- <FilterConditionDragLayer />
904
- <QueryBuilderFilterTree queryBuilderState={queryBuilderState} />
905
- </>
906
- )}
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>
907
893
  </div>
908
894
  </div>
909
895
  );