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