@finos/legend-application-query 5.1.0 → 5.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/lib/application/LegendQueryApplicationConfig.d.ts +17 -1
  2. package/lib/application/LegendQueryApplicationConfig.d.ts.map +1 -1
  3. package/lib/application/LegendQueryApplicationConfig.js +23 -1
  4. package/lib/application/LegendQueryApplicationConfig.js.map +1 -1
  5. package/lib/components/QueryBuilder.d.ts.map +1 -1
  6. package/lib/components/QueryBuilder.js +3 -1
  7. package/lib/components/QueryBuilder.js.map +1 -1
  8. package/lib/components/QueryBuilderExplorerPanel.d.ts.map +1 -1
  9. package/lib/components/QueryBuilderExplorerPanel.js +7 -34
  10. package/lib/components/QueryBuilderExplorerPanel.js.map +1 -1
  11. package/lib/components/QueryBuilderFetchStructurePanel.d.ts.map +1 -1
  12. package/lib/components/QueryBuilderFetchStructurePanel.js +77 -66
  13. package/lib/components/QueryBuilderFetchStructurePanel.js.map +1 -1
  14. package/lib/components/QueryBuilderFilterPanel.d.ts.map +1 -1
  15. package/lib/components/QueryBuilderFilterPanel.js +28 -58
  16. package/lib/components/QueryBuilderFilterPanel.js.map +1 -1
  17. package/lib/components/QueryBuilderFunctionsExplorerPanel.d.ts.map +1 -1
  18. package/lib/components/QueryBuilderFunctionsExplorerPanel.js +9 -39
  19. package/lib/components/QueryBuilderFunctionsExplorerPanel.js.map +1 -1
  20. package/lib/components/QueryBuilderGraphFetchTreePanel.d.ts.map +1 -1
  21. package/lib/components/QueryBuilderGraphFetchTreePanel.js +5 -5
  22. package/lib/components/QueryBuilderGraphFetchTreePanel.js.map +1 -1
  23. package/lib/components/QueryBuilderLambdaEditor.d.ts +1 -0
  24. package/lib/components/QueryBuilderLambdaEditor.d.ts.map +1 -1
  25. package/lib/components/QueryBuilderLambdaEditor.js +2 -2
  26. package/lib/components/QueryBuilderLambdaEditor.js.map +1 -1
  27. package/lib/components/QueryBuilderMilestoneEditor.js +5 -5
  28. package/lib/components/QueryBuilderMilestoneEditor.js.map +1 -1
  29. package/lib/components/QueryBuilderPanelIssueCountBadge.d.ts +20 -0
  30. package/lib/components/QueryBuilderPanelIssueCountBadge.d.ts.map +1 -0
  31. package/lib/components/QueryBuilderPanelIssueCountBadge.js +28 -0
  32. package/lib/components/QueryBuilderPanelIssueCountBadge.js.map +1 -0
  33. package/lib/components/QueryBuilderParameterPanel.d.ts.map +1 -1
  34. package/lib/components/QueryBuilderParameterPanel.js +13 -34
  35. package/lib/components/QueryBuilderParameterPanel.js.map +1 -1
  36. package/lib/components/QueryBuilderPostFilterPanel.d.ts.map +1 -1
  37. package/lib/components/QueryBuilderPostFilterPanel.js +33 -58
  38. package/lib/components/QueryBuilderPostFilterPanel.js.map +1 -1
  39. package/lib/components/QueryBuilderProjectionPanel.d.ts.map +1 -1
  40. package/lib/components/QueryBuilderProjectionPanel.js +47 -67
  41. package/lib/components/QueryBuilderProjectionPanel.js.map +1 -1
  42. package/lib/components/QueryBuilderPropertyExpressionEditor.d.ts.map +1 -1
  43. package/lib/components/QueryBuilderPropertyExpressionEditor.js +11 -11
  44. package/lib/components/QueryBuilderPropertyExpressionEditor.js.map +1 -1
  45. package/lib/components/QueryBuilderPropertySearchPanel.d.ts.map +1 -1
  46. package/lib/components/QueryBuilderPropertySearchPanel.js +3 -6
  47. package/lib/components/QueryBuilderPropertySearchPanel.js.map +1 -1
  48. package/lib/components/QueryBuilderResultModifierPanel.d.ts.map +1 -1
  49. package/lib/components/QueryBuilderResultModifierPanel.js +3 -1
  50. package/lib/components/QueryBuilderResultModifierPanel.js.map +1 -1
  51. package/lib/components/QueryBuilderResultPanel.d.ts.map +1 -1
  52. package/lib/components/QueryBuilderResultPanel.js +28 -20
  53. package/lib/components/QueryBuilderResultPanel.js.map +1 -1
  54. package/lib/components/QueryBuilderSetupPanel.d.ts.map +1 -1
  55. package/lib/components/QueryBuilderSetupPanel.js +10 -11
  56. package/lib/components/QueryBuilderSetupPanel.js.map +1 -1
  57. package/lib/components/QueryBuilderUnsupportedQueryEditor.d.ts.map +1 -1
  58. package/lib/components/QueryBuilderUnsupportedQueryEditor.js +4 -2
  59. package/lib/components/QueryBuilderUnsupportedQueryEditor.js.map +1 -1
  60. package/lib/components/QueryEditor.d.ts.map +1 -1
  61. package/lib/components/QueryEditor.js +16 -4
  62. package/lib/components/QueryEditor.js.map +1 -1
  63. package/lib/index.css +2 -2
  64. package/lib/index.css.map +1 -1
  65. package/lib/package.json +10 -9
  66. package/lib/stores/QueryBuilderExplorerState.d.ts.map +1 -1
  67. package/lib/stores/QueryBuilderExplorerState.js +5 -0
  68. package/lib/stores/QueryBuilderExplorerState.js.map +1 -1
  69. package/lib/stores/QueryBuilderFetchStructureState.d.ts +6 -0
  70. package/lib/stores/QueryBuilderFetchStructureState.d.ts.map +1 -1
  71. package/lib/stores/QueryBuilderFetchStructureState.js +8 -0
  72. package/lib/stores/QueryBuilderFetchStructureState.js.map +1 -1
  73. package/lib/stores/QueryBuilderFilterState.d.ts +4 -9
  74. package/lib/stores/QueryBuilderFilterState.d.ts.map +1 -1
  75. package/lib/stores/QueryBuilderFilterState.js +6 -11
  76. package/lib/stores/QueryBuilderFilterState.js.map +1 -1
  77. package/lib/stores/QueryBuilderGraphFetchTreeState.d.ts.map +1 -1
  78. package/lib/stores/QueryBuilderGraphFetchTreeState.js +6 -3
  79. package/lib/stores/QueryBuilderGraphFetchTreeState.js.map +1 -1
  80. package/lib/stores/QueryBuilderLambdaProcessor.d.ts.map +1 -1
  81. package/lib/stores/QueryBuilderLambdaProcessor.js +2 -0
  82. package/lib/stores/QueryBuilderLambdaProcessor.js.map +1 -1
  83. package/lib/stores/QueryBuilderPostFilterState.d.ts +4 -4
  84. package/lib/stores/QueryBuilderPostFilterState.d.ts.map +1 -1
  85. package/lib/stores/QueryBuilderPostFilterState.js +6 -6
  86. package/lib/stores/QueryBuilderPostFilterState.js.map +1 -1
  87. package/lib/stores/QueryBuilderProjectionState.d.ts +2 -7
  88. package/lib/stores/QueryBuilderProjectionState.d.ts.map +1 -1
  89. package/lib/stores/QueryBuilderProjectionState.js +5 -17
  90. package/lib/stores/QueryBuilderProjectionState.js.map +1 -1
  91. package/lib/stores/QueryBuilderSetupState.js +1 -1
  92. package/lib/stores/QueryBuilderSetupState.js.map +1 -1
  93. package/lib/stores/QueryBuilderState.d.ts +6 -1
  94. package/lib/stores/QueryBuilderState.d.ts.map +1 -1
  95. package/lib/stores/QueryBuilderState.js +9 -2
  96. package/lib/stores/QueryBuilderState.js.map +1 -1
  97. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.d.ts.map +1 -1
  98. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.js +7 -7
  99. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.js.map +1 -1
  100. package/lib/stores/QueryEditorStore.d.ts.map +1 -1
  101. package/lib/stores/QueryEditorStore.js +14 -3
  102. package/lib/stores/QueryEditorStore.js.map +1 -1
  103. package/lib/stores/QueryFunctionsExplorerState.d.ts +2 -6
  104. package/lib/stores/QueryFunctionsExplorerState.d.ts.map +1 -1
  105. package/lib/stores/QueryFunctionsExplorerState.js +2 -11
  106. package/lib/stores/QueryFunctionsExplorerState.js.map +1 -1
  107. package/lib/stores/QueryParametersState.d.ts +1 -3
  108. package/lib/stores/QueryParametersState.d.ts.map +1 -1
  109. package/lib/stores/QueryParametersState.js +1 -4
  110. package/lib/stores/QueryParametersState.js.map +1 -1
  111. package/lib/stores/filterOperators/QueryBuilderFilterOperator_Equal.d.ts.map +1 -1
  112. package/lib/stores/filterOperators/QueryBuilderFilterOperator_Equal.js +4 -1
  113. package/lib/stores/filterOperators/QueryBuilderFilterOperator_Equal.js.map +1 -1
  114. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.d.ts.map +1 -1
  115. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.js +4 -1
  116. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.js.map +1 -1
  117. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.d.ts.map +1 -1
  118. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.js +4 -1
  119. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.js.map +1 -1
  120. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThan.d.ts.map +1 -1
  121. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThan.js +4 -1
  122. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThan.js.map +1 -1
  123. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.d.ts.map +1 -1
  124. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.js +4 -1
  125. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.js.map +1 -1
  126. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.d.ts.map +1 -1
  127. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.js +4 -1
  128. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.js.map +1 -1
  129. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.d.ts.map +1 -1
  130. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.js +4 -1
  131. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.js.map +1 -1
  132. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.d.ts.map +1 -1
  133. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.js +4 -1
  134. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.js.map +1 -1
  135. package/package.json +17 -16
  136. package/src/application/LegendQueryApplicationConfig.ts +35 -1
  137. package/src/components/QueryBuilder.tsx +13 -2
  138. package/src/components/QueryBuilderExplorerPanel.tsx +17 -56
  139. package/src/components/QueryBuilderFetchStructurePanel.tsx +93 -80
  140. package/src/components/QueryBuilderFilterPanel.tsx +184 -225
  141. package/src/components/QueryBuilderFunctionsExplorerPanel.tsx +23 -68
  142. package/src/components/QueryBuilderGraphFetchTreePanel.tsx +34 -25
  143. package/src/components/QueryBuilderLambdaEditor.tsx +3 -0
  144. package/src/components/QueryBuilderMilestoneEditor.tsx +34 -34
  145. package/src/components/QueryBuilderPanelIssueCountBadge.tsx +38 -0
  146. package/src/components/QueryBuilderParameterPanel.tsx +21 -54
  147. package/src/components/QueryBuilderPostFilterPanel.tsx +202 -236
  148. package/src/components/QueryBuilderProjectionPanel.tsx +126 -170
  149. package/src/components/QueryBuilderPropertyExpressionEditor.tsx +61 -57
  150. package/src/components/QueryBuilderPropertySearchPanel.tsx +8 -9
  151. package/src/components/QueryBuilderResultModifierPanel.tsx +4 -2
  152. package/src/components/QueryBuilderResultPanel.tsx +71 -52
  153. package/src/components/QueryBuilderSetupPanel.tsx +10 -11
  154. package/src/components/QueryBuilderUnsupportedQueryEditor.tsx +4 -2
  155. package/src/components/QueryEditor.tsx +39 -1
  156. package/src/stores/QueryBuilderExplorerState.ts +5 -0
  157. package/src/stores/QueryBuilderFetchStructureState.ts +9 -0
  158. package/src/stores/QueryBuilderFilterState.ts +7 -12
  159. package/src/stores/QueryBuilderGraphFetchTreeState.ts +14 -8
  160. package/src/stores/QueryBuilderLambdaProcessor.ts +8 -0
  161. package/src/stores/QueryBuilderPostFilterState.ts +7 -7
  162. package/src/stores/QueryBuilderProjectionState.ts +7 -18
  163. package/src/stores/QueryBuilderSetupState.ts +1 -1
  164. package/src/stores/QueryBuilderState.ts +10 -2
  165. package/src/stores/QueryBuilderValueSpecificationBuilderHelper.ts +9 -7
  166. package/src/stores/QueryEditorStore.ts +19 -3
  167. package/src/stores/QueryFunctionsExplorerState.ts +1 -11
  168. package/src/stores/QueryParametersState.ts +1 -3
  169. package/src/stores/filterOperators/QueryBuilderFilterOperator_Equal.ts +8 -1
  170. package/src/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.ts +8 -1
  171. package/src/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.ts +8 -1
  172. package/src/stores/filterOperators/QueryBuilderFilterOperator_LessThan.ts +8 -1
  173. package/src/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.ts +8 -1
  174. package/src/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.ts +8 -1
  175. package/src/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.ts +8 -1
  176. package/src/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.ts +8 -1
  177. package/tsconfig.json +1 -0
@@ -28,7 +28,10 @@ import {
28
28
  ContextMenu,
29
29
  InputWithInlineValidation,
30
30
  SigmaIcon,
31
- TimesCircleIcon,
31
+ PanelDropZone,
32
+ DragPreviewLayer,
33
+ PanelEntryDropZonePlaceholder,
34
+ useDragPreviewLayer,
32
35
  } from '@finos/legend-art';
33
36
  import {
34
37
  type QueryBuilderExplorerTreeDragSource,
@@ -36,32 +39,28 @@ import {
36
39
  buildPropertyExpressionFromExplorerTreeNodeData,
37
40
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE,
38
41
  } from '../stores/QueryBuilderExplorerState.js';
39
- import {
40
- type DropTargetMonitor,
41
- type XYCoord,
42
- useDragLayer,
43
- useDrag,
44
- useDrop,
45
- } from 'react-dnd';
46
- import { getEmptyImage } from 'react-dnd-html5-backend';
42
+ import { type DropTargetMonitor, useDrag, useDrop } from 'react-dnd';
47
43
  import {
48
44
  type QueryBuilderProjectionColumnDragSource,
49
45
  type QueryBuilderProjectionColumnState,
50
46
  QueryBuilderDerivationProjectionColumnState,
51
47
  QueryBuilderSimpleProjectionColumnState,
52
- QUERY_BUILDER_PROJECTION_DND_TYPE,
48
+ QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE,
53
49
  } from '../stores/QueryBuilderProjectionState.js';
54
50
  import { QueryBuilderPropertyExpressionBadge } from './QueryBuilderPropertyExpressionEditor.js';
55
51
  import type { QueryBuilderState } from '../stores/QueryBuilderState.js';
56
52
  import { QueryResultModifierModal } from './QueryBuilderResultModifierPanel.js';
57
53
  import { QUERY_BUILDER_TEST_ID } from './QueryBuilder_TestID.js';
58
- import type { QueryBuilderAggregateOperator } from '../stores/QueryBuilderAggregationState.js';
54
+ import {
55
+ type QueryBuilderAggregateOperator,
56
+ QueryBuilderAggregateColumnState,
57
+ } from '../stores/QueryBuilderAggregationState.js';
59
58
  import { flowResult } from 'mobx';
60
59
  import { QueryBuilderLambdaEditor } from './QueryBuilderLambdaEditor.js';
61
60
  import { useApplicationStore } from '@finos/legend-application';
62
61
  import {
63
62
  type QueryBuilderParameterDragSource,
64
- QUERY_BUILDER_PARAMETER_TREE_DND_TYPE,
63
+ QUERY_BUILDER_PARAMETER_DND_TYPE,
65
64
  } from '../stores/QueryParametersState.js';
66
65
  import {
67
66
  type ConcreteFunctionDefinition,
@@ -71,51 +70,12 @@ import {
71
70
  } from '@finos/legend-graph';
72
71
  import {
73
72
  type QueryBuilderFunctionsExplorerDragSource,
74
- QUERY_BUILDER_FUNCTIONS_EXPLORER_TREE_DND_TYPE,
73
+ QUERY_BUILDER_FUNCTION_DND_TYPE,
75
74
  } from '../stores/QueryFunctionsExplorerState.js';
76
75
  import { DEFAULT_LAMBDA_VARIABLE_NAME } from '../QueryBuilder_Const.js';
77
76
  import { QueryBuilderPostFilterTreeConditionNodeData } from '../stores/QueryBuilderPostFilterState.js';
78
77
  import { filterByType } from '@finos/legend-shared';
79
78
 
80
- const ProjectionColumnDragLayer: React.FC = () => {
81
- const { itemType, item, isDragging, currentPosition } = useDragLayer(
82
- (monitor) => ({
83
- itemType: monitor.getItemType(),
84
- item: monitor.getItem<QueryBuilderProjectionColumnDragSource | null>(),
85
- isDragging: monitor.isDragging(),
86
- initialOffset: monitor.getInitialSourceClientOffset(),
87
- currentPosition: monitor.getClientOffset(),
88
- }),
89
- );
90
-
91
- if (
92
- !isDragging ||
93
- !item ||
94
- itemType !== QUERY_BUILDER_PROJECTION_DND_TYPE.PROJECTION_COLUMN
95
- ) {
96
- return null;
97
- }
98
- return (
99
- <div className="query-builder__projection__column__drag-preview-layer">
100
- <div
101
- className="query-builder__projection__column__drag-preview"
102
- // added some offset so the mouse doesn't overlap the label too much
103
- style={
104
- !currentPosition
105
- ? { display: 'none' }
106
- : {
107
- transform: `translate(${currentPosition.x + 20}px, ${
108
- currentPosition.y + 10
109
- }px)`,
110
- }
111
- }
112
- >
113
- {item.columnState.columnName}
114
- </div>
115
- </div>
116
- );
117
- };
118
-
119
79
  const QueryBuilderProjectionColumnContextMenu = observer(
120
80
  forwardRef<
121
81
  HTMLDivElement,
@@ -192,7 +152,7 @@ const QueryBuilderDerivationProjectionColumnEditor = observer(
192
152
  | QueryBuilderFunctionsExplorerDragSource,
193
153
  type: string,
194
154
  ): void => {
195
- if (type === QUERY_BUILDER_PARAMETER_TREE_DND_TYPE.VARIABLE) {
155
+ if (type === QUERY_BUILDER_PARAMETER_DND_TYPE) {
196
156
  projectionColumnState.derivationLambdaEditorState.setLambdaString(
197
157
  `${
198
158
  projectionColumnState.derivationLambdaEditorState.lambdaString
@@ -200,9 +160,7 @@ const QueryBuilderDerivationProjectionColumnEditor = observer(
200
160
  (item as QueryBuilderParameterDragSource).variable.variableName
201
161
  }`,
202
162
  );
203
- } else if (
204
- type === QUERY_BUILDER_FUNCTIONS_EXPLORER_TREE_DND_TYPE.FUNCTION
205
- ) {
163
+ } else if (type === QUERY_BUILDER_FUNCTION_DND_TYPE) {
206
164
  projectionColumnState.derivationLambdaEditorState.setLambdaString(
207
165
  `${
208
166
  projectionColumnState.derivationLambdaEditorState.lambdaString
@@ -220,23 +178,21 @@ const QueryBuilderDerivationProjectionColumnEditor = observer(
220
178
  },
221
179
  [projectionColumnState],
222
180
  );
223
- const [, dropConnector] = useDrop(
181
+ const [, dropConnector] = useDrop<
182
+ | QueryBuilderExplorerTreeDragSource
183
+ | QueryBuilderParameterDragSource
184
+ | QueryBuilderFunctionsExplorerDragSource
185
+ >(
224
186
  () => ({
225
187
  accept: [
226
188
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ROOT,
227
189
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.CLASS_PROPERTY,
228
190
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ENUM_PROPERTY,
229
191
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY,
230
- QUERY_BUILDER_PARAMETER_TREE_DND_TYPE.VARIABLE,
231
- QUERY_BUILDER_FUNCTIONS_EXPLORER_TREE_DND_TYPE.FUNCTION,
192
+ QUERY_BUILDER_PARAMETER_DND_TYPE,
193
+ QUERY_BUILDER_FUNCTION_DND_TYPE,
232
194
  ],
233
- drop: (
234
- item:
235
- | QueryBuilderExplorerTreeDragSource
236
- | QueryBuilderParameterDragSource
237
- | QueryBuilderFunctionsExplorerDragSource,
238
- monitor,
239
- ): void => {
195
+ drop: (item, monitor): void => {
240
196
  if (!monitor.didDrop()) {
241
197
  handleDrop(item, monitor.getItemType() as string);
242
198
  } // prevent drop event propagation to accomondate for nested DnD
@@ -271,10 +227,7 @@ const QueryBuilderDerivationProjectionColumnEditor = observer(
271
227
  );
272
228
 
273
229
  const QueryBuilderProjectionColumnEditor = observer(
274
- (props: {
275
- projectionColumnState: QueryBuilderProjectionColumnState;
276
- isRearrangingColumns: boolean;
277
- }) => {
230
+ (props: { projectionColumnState: QueryBuilderProjectionColumnState }) => {
278
231
  const ref = useRef<HTMLDivElement>(null);
279
232
 
280
233
  const [isSelectedFromContextMenu, setIsSelectedFromContextMenu] =
@@ -282,18 +235,26 @@ const QueryBuilderProjectionColumnEditor = observer(
282
235
  const onContextMenuOpen = (): void => setIsSelectedFromContextMenu(true);
283
236
  const onContextMenuClose = (): void => setIsSelectedFromContextMenu(false);
284
237
 
285
- const { projectionColumnState, isRearrangingColumns } = props;
238
+ const { projectionColumnState } = props;
286
239
  const queryBuilderState =
287
240
  projectionColumnState.projectionState.queryBuilderState;
288
241
  const projectionState =
289
242
  queryBuilderState.fetchStructureState.projectionState;
290
-
291
- const isRemovalDisabled = Array.from(
243
+ const postFilterColumnStates = Array.from(
292
244
  queryBuilderState.postFilterState.nodes.values(),
293
245
  )
294
246
  .filter(filterByType(QueryBuilderPostFilterTreeConditionNodeData))
295
- .map((n) => n.condition.columnState)
296
- .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);
297
258
 
298
259
  const removeColumn = (): void =>
299
260
  projectionState.removeColumn(projectionColumnState);
@@ -342,8 +303,7 @@ const QueryBuilderProjectionColumnEditor = observer(
342
303
  ((hoverBoundingReact?.bottom ?? 0) - (hoverBoundingReact?.top ?? 0)) /
343
304
  2;
344
305
  const dragDistance =
345
- (monitor.getClientOffset() as XYCoord).y -
346
- (hoverBoundingReact?.top ?? 0);
306
+ (monitor.getClientOffset()?.y ?? 0) - (hoverBoundingReact?.top ?? 0);
347
307
  if (dragIndex < hoverIndex && dragDistance < distanceThreshold) {
348
308
  return;
349
309
  }
@@ -354,50 +314,54 @@ const QueryBuilderProjectionColumnEditor = observer(
354
314
  },
355
315
  [projectionColumnState, projectionState],
356
316
  );
357
- const [, dropConnector] = useDrop(
317
+ const [, dropConnector] = useDrop<QueryBuilderProjectionColumnDragSource>(
358
318
  () => ({
359
- accept: [QUERY_BUILDER_PROJECTION_DND_TYPE.PROJECTION_COLUMN],
360
- hover: (
361
- item: QueryBuilderProjectionColumnDragSource,
362
- monitor: DropTargetMonitor,
363
- ): void => handleHover(item, monitor),
319
+ accept: [QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE],
320
+ hover: (item, monitor): void => handleHover(item, monitor),
364
321
  }),
365
322
  [handleHover],
366
323
  );
367
- 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
+ >(
368
337
  () => ({
369
- type: QUERY_BUILDER_PROJECTION_DND_TYPE.PROJECTION_COLUMN,
370
- item: (): QueryBuilderProjectionColumnDragSource => {
371
- projectionColumnState.setIsBeingDragged(true);
372
- return { columnState: projectionColumnState };
373
- },
374
- end: (item: QueryBuilderProjectionColumnDragSource | undefined): void =>
375
- 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
+ }),
376
351
  }),
377
352
  [projectionColumnState],
378
353
  );
354
+ const isBeingDragged =
355
+ projectionColumnState === projectionColumnBeingDragged;
379
356
  dragConnector(dropConnector(ref));
380
-
381
- // hide default HTML5 preview image
382
- useEffect(() => {
383
- dragPreviewConnector(getEmptyImage(), { captureDraggingState: true });
384
- }, [dragPreviewConnector]);
357
+ useDragPreviewLayer(dragPreviewConnector);
385
358
 
386
359
  return (
387
- <div
388
- ref={ref}
389
- className={clsx('query-builder__projection__column', {
390
- 'query-builder__projection__column--dragged':
391
- projectionColumnState.isBeingDragged,
392
- 'query-builder__projection__column--no-hover': isRearrangingColumns,
393
- })}
394
- >
395
- {projectionColumnState.isBeingDragged && (
396
- <div className="query-builder__projection__column__dnd__placeholder__container">
397
- <div className="query-builder__dnd__placeholder query-builder__projection__column__dnd__placeholder" />
398
- </div>
399
- )}
400
- {!projectionColumnState.isBeingDragged && (
360
+ <div ref={ref} className="query-builder__projection__column">
361
+ <PanelEntryDropZonePlaceholder
362
+ showPlaceholder={isBeingDragged}
363
+ className="query-builder__dnd__placeholder"
364
+ >
401
365
  <ContextMenu
402
366
  content={
403
367
  <QueryBuilderProjectionColumnContextMenu
@@ -418,8 +382,8 @@ const QueryBuilderProjectionColumnEditor = observer(
418
382
  onOpen={onContextMenuOpen}
419
383
  onClose={onContextMenuClose}
420
384
  >
421
- <div className="query-builder__projection__column__dnd__indicator">
422
- <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">
423
387
  <VerticalDragHandleIcon />
424
388
  </div>
425
389
  </div>
@@ -527,7 +491,7 @@ const QueryBuilderProjectionColumnEditor = observer(
527
491
  </button>
528
492
  </div>
529
493
  </ContextMenu>
530
- )}
494
+ </PanelEntryDropZonePlaceholder>
531
495
  </div>
532
496
  );
533
497
  },
@@ -540,10 +504,6 @@ export const QueryBuilderProjectionPanel = observer(
540
504
  const projectionState =
541
505
  queryBuilderState.fetchStructureState.projectionState;
542
506
  const projectionColumns = projectionState.columns;
543
- // Drag and Drop
544
- const isRearrangingColumns = projectionColumns.some(
545
- (columnState) => columnState.isBeingDragged,
546
- );
547
507
  const handleDrop = useCallback(
548
508
  (
549
509
  item:
@@ -552,11 +512,13 @@ export const QueryBuilderProjectionPanel = observer(
552
512
  type: string,
553
513
  ): void => {
554
514
  switch (type) {
555
- case QUERY_BUILDER_FUNCTIONS_EXPLORER_TREE_DND_TYPE.FUNCTION: {
515
+ case QUERY_BUILDER_FUNCTION_DND_TYPE: {
556
516
  const derivationProjectionColumn =
557
517
  new QueryBuilderDerivationProjectionColumnState(
558
518
  projectionState,
559
- queryBuilderState.graphManagerState.graphManager.HACKY__createDefaultBlankLambda(),
519
+ queryBuilderState.graphManagerState.graphManager.createDefaultBasicRawLambda(
520
+ { addDummyParameter: true },
521
+ ),
560
522
  );
561
523
  derivationProjectionColumn.derivationLambdaEditorState.setLambdaString(
562
524
  `${DEFAULT_LAMBDA_VARIABLE_NAME}${LAMBDA_PIPE}${generateFunctionCallString(
@@ -590,26 +552,25 @@ export const QueryBuilderProjectionPanel = observer(
590
552
  [queryBuilderState, projectionState],
591
553
  );
592
554
 
593
- const isInvalidProjection = !projectionState.isValidProjectionState();
594
- const [{ isPropertyDragOver }, dropConnector] = useDrop(
555
+ const [{ isDragOver }, dropTargetConnector] = useDrop<
556
+ | QueryBuilderExplorerTreeDragSource
557
+ | QueryBuilderFunctionsExplorerDragSource,
558
+ void,
559
+ { isDragOver: boolean }
560
+ >(
595
561
  () => ({
596
562
  accept: [
597
563
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ENUM_PROPERTY,
598
564
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY,
599
- QUERY_BUILDER_FUNCTIONS_EXPLORER_TREE_DND_TYPE.FUNCTION,
565
+ QUERY_BUILDER_FUNCTION_DND_TYPE,
600
566
  ],
601
- drop: (
602
- item:
603
- | QueryBuilderExplorerTreeDragSource
604
- | QueryBuilderFunctionsExplorerDragSource,
605
- monitor: DropTargetMonitor,
606
- ): void => {
567
+ drop: (item, monitor): void => {
607
568
  if (!monitor.didDrop()) {
608
569
  handleDrop(item, monitor.getItemType() as string);
609
570
  } // prevent drop event propagation to accomondate for nested DnD
610
571
  },
611
- collect: (monitor): { isPropertyDragOver: boolean } => ({
612
- isPropertyDragOver: monitor.isOver({ shallow: true }),
572
+ collect: (monitor) => ({
573
+ isDragOver: monitor.isOver({ shallow: true }),
613
574
  }),
614
575
  }),
615
576
  [handleDrop],
@@ -622,47 +583,42 @@ export const QueryBuilderProjectionPanel = observer(
622
583
  }, [applicationStore, projectionState]);
623
584
 
624
585
  return (
625
- <div
626
- ref={dropConnector}
627
- className={`panel__content dnd__overlay__container`}
628
- >
629
- {isInvalidProjection && (
630
- <div className="query-builder__projection__container__error">
631
- <div className="query-builder__projection__error__label">
632
- <TimesCircleIcon className="query-builder__projection__error__icon" />
633
- {projectionState.getValidationErrorMessage() ??
634
- 'There is an error with the projection'}
635
- </div>
636
- </div>
637
- )}
638
-
639
- <div className={clsx({ dnd__overlay: isPropertyDragOver })} />
640
-
641
- {!projectionColumns.length && (
642
- <BlankPanelPlaceholder
643
- placeholderText="Add a projection column"
644
- tooltipText="Drag and drop properties here"
645
- />
646
- )}
647
- {Boolean(projectionColumns.length) && (
648
- <div
649
- data-testid={QUERY_BUILDER_TEST_ID.QUERY_BUILDER_PROJECTION}
650
- className={`query-builder__projection__columns ${clsx({
651
- ['query-builder__projection__columns--with-error']:
652
- isInvalidProjection,
653
- })} `}
654
- >
655
- <ProjectionColumnDragLayer />
656
- {projectionColumns.map((projectionColumnState) => (
657
- <QueryBuilderProjectionColumnEditor
658
- key={projectionColumnState.uuid}
659
- projectionColumnState={projectionColumnState}
660
- 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]}
661
611
  />
662
- ))}
663
- </div>
664
- )}
665
- <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>
666
622
  </div>
667
623
  );
668
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
  },