@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
@@ -14,6 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
+ import { useState } from 'react';
17
18
  import { observer } from 'mobx-react-lite';
18
19
  import {
19
20
  type TooltipPlacement,
@@ -37,15 +38,17 @@ import {
37
38
  MenuContentItemIcon,
38
39
  MenuContentItemLabel,
39
40
  MoreVerticalIcon,
41
+ DragPreviewLayer,
42
+ useDragPreviewLayer,
40
43
  } from '@finos/legend-art';
41
44
  import {
42
45
  type QueryBuilderFunctionsExplorerTreeNodeData,
43
46
  type QueryBuilderFunctionsExplorerDragSource,
44
- QUERY_BUILDER_FUNCTIONS_EXPLORER_TREE_DND_TYPE,
45
47
  generateFunctionsExplorerTreeNodeData,
46
48
  getFunctionsExplorerTreeNodeChildren,
49
+ QUERY_BUILDER_FUNCTION_DND_TYPE,
47
50
  } from '../stores/QueryFunctionsExplorerState.js';
48
- import { useDrag, useDragLayer } from 'react-dnd';
51
+ import { useDrag } from 'react-dnd';
49
52
  import {
50
53
  ConcreteFunctionDefinition,
51
54
  generateFunctionSignature,
@@ -54,8 +57,6 @@ import {
54
57
  ROOT_PACKAGE_NAME,
55
58
  getMultiplicityDescription,
56
59
  } from '@finos/legend-graph';
57
- import { getEmptyImage } from 'react-dnd-html5-backend';
58
- import { useEffect, useState } from 'react';
59
60
  import type { QueryBuilderState } from '../stores/QueryBuilderState.js';
60
61
 
61
62
  const isDependencyTreeNode = (
@@ -134,53 +135,6 @@ const QueryBuilderFunctionInfoTooltip: React.FC<{
134
135
  );
135
136
  };
136
137
 
137
- const QueryBuilderFunctionDragLayer = observer(
138
- (props: { queryBuilderState: QueryBuilderState }) => {
139
- const { itemType, item, isDragging, currentPosition } = useDragLayer(
140
- (monitor) => ({
141
- itemType:
142
- monitor.getItemType() as QUERY_BUILDER_FUNCTIONS_EXPLORER_TREE_DND_TYPE,
143
- item: monitor.getItem<QueryBuilderFunctionsExplorerDragSource | null>(),
144
- isDragging: monitor.isDragging(),
145
- initialOffset: monitor.getInitialSourceClientOffset(),
146
- currentPosition: monitor.getClientOffset(),
147
- }),
148
- );
149
- if (
150
- !isDragging ||
151
- !item ||
152
- !Object.values(QUERY_BUILDER_FUNCTIONS_EXPLORER_TREE_DND_TYPE).includes(
153
- itemType,
154
- ) ||
155
- item.node.dndType ===
156
- QUERY_BUILDER_FUNCTIONS_EXPLORER_TREE_DND_TYPE.PACKAGE
157
- ) {
158
- return null;
159
- }
160
- return (
161
- <div className="query-builder__functions-explorer__tree__drag-preview-layer">
162
- <div
163
- className="query-builder__functions-explorer__tree__drag-preview"
164
- style={
165
- !currentPosition
166
- ? { display: 'none' }
167
- : {
168
- transform: `translate(${currentPosition.x + 20}px, ${
169
- currentPosition.y + 10
170
- }px)`,
171
- }
172
- }
173
- >
174
- {generateFunctionSignature(
175
- item.node.packageableElement as ConcreteFunctionDefinition,
176
- true,
177
- )}
178
- </div>
179
- </div>
180
- );
181
- },
182
- );
183
-
184
138
  const QueryBuilderFunctionsExplorerListEntry = observer(
185
139
  (props: {
186
140
  queryBuilderState: QueryBuilderState;
@@ -196,15 +150,12 @@ const QueryBuilderFunctionsExplorerListEntry = observer(
196
150
  const functionSignature = generateFunctionSignature(element, true);
197
151
  const [, dragConnector, dragPreviewConnector] = useDrag(
198
152
  () => ({
199
- type: QUERY_BUILDER_FUNCTIONS_EXPLORER_TREE_DND_TYPE.FUNCTION,
153
+ type: QUERY_BUILDER_FUNCTION_DND_TYPE,
200
154
  item: { node: node },
201
155
  }),
202
156
  [node],
203
157
  );
204
- // hide default HTML5 preview image
205
- useEffect(() => {
206
- dragPreviewConnector(getEmptyImage(), { captureDraggingState: true });
207
- }, [dragPreviewConnector]);
158
+ useDragPreviewLayer(dragPreviewConnector);
208
159
 
209
160
  return (
210
161
  <div
@@ -279,23 +230,19 @@ const QueryBuilderFunctionsExplorerTreeNodeContainer = observer(
279
230
  const selectNode = (): void => {
280
231
  onNodeSelect?.(node);
281
232
  };
282
- const [, dragConnector, dragPreviewConnector] = useDrag(
233
+ const [, dragConnector, dragPreviewConnector] = useDrag<{
234
+ node?: QueryBuilderFunctionsExplorerTreeNodeData;
235
+ }>(
283
236
  () => ({
284
- type:
285
- node.packageableElement instanceof ConcreteFunctionDefinition
286
- ? QUERY_BUILDER_FUNCTIONS_EXPLORER_TREE_DND_TYPE.FUNCTION
287
- : QUERY_BUILDER_FUNCTIONS_EXPLORER_TREE_DND_TYPE.PACKAGE,
288
- item: (): { node?: QueryBuilderFunctionsExplorerTreeNodeData } =>
237
+ type: QUERY_BUILDER_FUNCTION_DND_TYPE,
238
+ item: () =>
289
239
  node.packageableElement instanceof ConcreteFunctionDefinition
290
240
  ? { node }
291
241
  : {},
292
242
  }),
293
243
  [node],
294
244
  );
295
- // hide default HTML5 preview image
296
- useEffect(() => {
297
- dragPreviewConnector(getEmptyImage(), { captureDraggingState: true });
298
- }, [dragPreviewConnector]);
245
+ useDragPreviewLayer(dragPreviewConnector);
299
246
 
300
247
  return (
301
248
  <div>
@@ -523,8 +470,16 @@ export const QueryBuilderFunctionsExplorerPanel = observer(
523
470
  </div>
524
471
  </div>
525
472
  <div className="panel__content query-builder__functions-explorer__content">
526
- <QueryBuilderFunctionDragLayer
527
- queryBuilderState={queryBuilderState}
473
+ <DragPreviewLayer
474
+ labelGetter={(
475
+ item: QueryBuilderFunctionsExplorerDragSource,
476
+ ): string =>
477
+ generateFunctionSignature(
478
+ item.node.packageableElement as ConcreteFunctionDefinition,
479
+ true,
480
+ )
481
+ }
482
+ types={[QUERY_BUILDER_FUNCTION_DND_TYPE]}
528
483
  />
529
484
  {((showDependencyFuncions &&
530
485
  (!queryFunctionsState.dependencyTreeData ||
@@ -16,7 +16,7 @@
16
16
 
17
17
  import { useCallback } from 'react';
18
18
  import { observer } from 'mobx-react-lite';
19
- import { type DropTargetMonitor, useDrop } from 'react-dnd';
19
+ import { useDrop } from 'react-dnd';
20
20
  import {
21
21
  type TreeNodeContainerProps,
22
22
  clsx,
@@ -27,6 +27,8 @@ import {
27
27
  TimesIcon,
28
28
  CheckSquareIcon,
29
29
  SquareIcon,
30
+ InfoCircleIcon,
31
+ PanelDropZone,
30
32
  } from '@finos/legend-art';
31
33
  import type { QueryBuilderState } from '../stores/QueryBuilderState.js';
32
34
  import { QUERY_BUILDER_TEST_ID } from './QueryBuilder_TestID.js';
@@ -182,6 +184,9 @@ export const QueryBuilderGraphFetchTreeExplorer = observer(
182
184
  <div className="panel__content__form__section__toggler__prompt">
183
185
  Check graph fetch
184
186
  </div>
187
+ <div className="query-builder-graph-fetch-tree__settings__hint-icon">
188
+ <InfoCircleIcon title="With this enabled, while executing, violations of constraints will reported as part of the result, rather than causing a failure" />
189
+ </div>
185
190
  </div>
186
191
  </div>
187
192
  <div className="query-builder-graph-fetch-tree__container">
@@ -222,22 +227,23 @@ export const QueryBuilderGraphFetchTreePanel = observer(
222
227
  },
223
228
  [graphFetchState],
224
229
  );
225
- const [{ isPropertyDragOver }, dropConnector] = useDrop(
230
+ const [{ isDragOver }, dropTargetConnector] = useDrop<
231
+ QueryBuilderExplorerTreeDragSource,
232
+ void,
233
+ { isDragOver: boolean }
234
+ >(
226
235
  () => ({
227
236
  accept: [
228
237
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ENUM_PROPERTY,
229
238
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY,
230
239
  ],
231
- drop: (
232
- item: QueryBuilderExplorerTreeDragSource,
233
- monitor: DropTargetMonitor,
234
- ): void => {
240
+ drop: (item, monitor): void => {
235
241
  if (!monitor.didDrop()) {
236
242
  handleDrop(item);
237
243
  } // prevent drop event propagation to accomondate for nested DnD
238
244
  },
239
- collect: (monitor): { isPropertyDragOver: boolean } => ({
240
- isPropertyDragOver: monitor.isOver({ shallow: true }),
245
+ collect: (monitor) => ({
246
+ isDragOver: monitor.isOver({ shallow: true }),
241
247
  }),
242
248
  }),
243
249
  [handleDrop],
@@ -246,24 +252,27 @@ export const QueryBuilderGraphFetchTreePanel = observer(
246
252
  return (
247
253
  <div
248
254
  data-testid={QUERY_BUILDER_TEST_ID.QUERY_BUILDER_GRAPH_FETCH}
249
- className="panel__content dnd__overlay__container"
250
- ref={dropConnector}
255
+ className="panel__content"
251
256
  >
252
- <div className={clsx({ dnd__overlay: isPropertyDragOver })} />
253
- {(!treeData || isGraphFetchTreeDataEmpty(treeData)) && (
254
- <BlankPanelPlaceholder
255
- placeholderText="Add a graph fetch property"
256
- tooltipText="Drag and drop properties here"
257
- />
258
- )}
259
- {treeData && !isGraphFetchTreeDataEmpty(treeData) && (
260
- <QueryBuilderGraphFetchTreeExplorer
261
- graphFetchState={graphFetchState}
262
- treeData={treeData}
263
- isReadOnly={false}
264
- updateTreeData={updateTreeData}
265
- />
266
- )}
257
+ <PanelDropZone
258
+ isDragOver={isDragOver}
259
+ dropTargetConnector={dropTargetConnector}
260
+ >
261
+ {(!treeData || isGraphFetchTreeDataEmpty(treeData)) && (
262
+ <BlankPanelPlaceholder
263
+ text="Add a graph fetch property"
264
+ tooltipText="Drag and drop properties here"
265
+ />
266
+ )}
267
+ {treeData && !isGraphFetchTreeDataEmpty(treeData) && (
268
+ <QueryBuilderGraphFetchTreeExplorer
269
+ graphFetchState={graphFetchState}
270
+ treeData={treeData}
271
+ isReadOnly={false}
272
+ updateTreeData={updateTreeData}
273
+ />
274
+ )}
275
+ </PanelDropZone>
267
276
  </div>
268
277
  );
269
278
  },
@@ -47,6 +47,7 @@ export const QueryBuilderLambdaEditor = observer(
47
47
  disablePopUp?: boolean | undefined;
48
48
  useBaseTextEditorSettings?: boolean | undefined;
49
49
  hideErrorBar?: boolean | undefined;
50
+ onEditorFocusEventHandler?: (() => void) | undefined;
50
51
  }) => {
51
52
  const {
52
53
  queryBuilderState,
@@ -62,6 +63,7 @@ export const QueryBuilderLambdaEditor = observer(
62
63
  disablePopUp,
63
64
  useBaseTextEditorSettings,
64
65
  hideErrorBar,
66
+ onEditorFocusEventHandler,
65
67
  } = props;
66
68
  const applicationStore = useApplicationStore();
67
69
  const backdropSetter = useCallback(
@@ -111,6 +113,7 @@ export const QueryBuilderLambdaEditor = observer(
111
113
  useBaseTextEditorSettings={useBaseTextEditorSettings}
112
114
  hideErrorBar={hideErrorBar}
113
115
  onKeyDownEventHandlers={onKeyDownEventHandlers}
116
+ onEditorFocusEventHandler={onEditorFocusEventHandler}
114
117
  />
115
118
  );
116
119
  },
@@ -18,7 +18,7 @@ import { observer } from 'mobx-react-lite';
18
18
  import type { QueryBuilderState } from '../stores/QueryBuilderState.js';
19
19
  import {
20
20
  type QueryBuilderParameterDragSource,
21
- QUERY_BUILDER_PARAMETER_TREE_DND_TYPE,
21
+ QUERY_BUILDER_PARAMETER_DND_TYPE,
22
22
  } from '../stores/QueryParametersState.js';
23
23
  import { useCallback } from 'react';
24
24
  import {
@@ -32,9 +32,9 @@ import {
32
32
  TYPICAL_MULTIPLICITY_TYPE,
33
33
  } from '@finos/legend-graph';
34
34
  import { guaranteeNonNullable } from '@finos/legend-shared';
35
- import { type DropTargetMonitor, useDrop } from 'react-dnd';
35
+ import { useDrop } from 'react-dnd';
36
36
  import { VariableExpressionViewer } from './QueryBuilderParameterPanel.js';
37
- import { Dialog } from '@finos/legend-art';
37
+ import { Dialog, PanelEntryDropZonePlaceholder } from '@finos/legend-art';
38
38
  import { generateDefaultValueForPrimitiveType } from '../stores/QueryBuilderValueSpecificationBuilderHelper.js';
39
39
  import { BasicValueSpecificationEditor } from '@finos/legend-application';
40
40
 
@@ -58,13 +58,14 @@ const MilestoningParameterEditor = observer(
58
58
  },
59
59
  [queryBuilderState, stereotype],
60
60
  );
61
- const [{ isMilestoningParameterValueDragOver }, dropConnector] = useDrop(
61
+ const [{ isMilestoningParameterValueDragOver }, dropConnector] = useDrop<
62
+ QueryBuilderParameterDragSource,
63
+ void,
64
+ { isMilestoningParameterValueDragOver: boolean }
65
+ >(
62
66
  () => ({
63
- accept: [QUERY_BUILDER_PARAMETER_TREE_DND_TYPE.VARIABLE],
64
- drop: (
65
- item: QueryBuilderParameterDragSource,
66
- monitor: DropTargetMonitor,
67
- ): void => {
67
+ accept: [QUERY_BUILDER_PARAMETER_DND_TYPE],
68
+ drop: (item, monitor): void => {
68
69
  if (!monitor.didDrop()) {
69
70
  handleDrop(item);
70
71
  }
@@ -114,32 +115,31 @@ const MilestoningParameterEditor = observer(
114
115
  queryBuilderState.querySetupState.setProcessingDate(parameter);
115
116
  }
116
117
  };
118
+
117
119
  return (
118
- <div
119
- ref={dropConnector}
120
- className="query-builder__parameter-editor dnd__overlay__container"
121
- >
122
- {isMilestoningParameterValueDragOver && (
123
- <div className="query-builder__parameter-editor__node__dnd__overlay">
124
- Change Milestoning Parameter Value
125
- </div>
126
- )}
127
- <BasicValueSpecificationEditor
128
- valueSpecification={milestoningParameter}
129
- graph={queryBuilderState.graphManagerState.graph}
130
- setValueSpecification={(val: ValueSpecification): void =>
131
- stereotype === MILESTONING_STEREOTYPE.BUSINESS_TEMPORAL
132
- ? queryBuilderState.querySetupState.setBusinessDate(val)
133
- : queryBuilderState.querySetupState.setProcessingDate(val)
134
- }
135
- typeCheckOption={{
136
- expectedType:
137
- queryBuilderState.graphManagerState.graph.getPrimitiveType(
138
- PRIMITIVE_TYPE.DATE,
139
- ),
140
- }}
141
- resetValue={resetMilestoningParameter}
142
- />
120
+ <div ref={dropConnector} className="query-builder__parameter-editor">
121
+ <PanelEntryDropZonePlaceholder
122
+ showPlaceholder={isMilestoningParameterValueDragOver}
123
+ label="Change Milestoning Parameter Value"
124
+ className="query-builder__dnd__placeholder"
125
+ >
126
+ <BasicValueSpecificationEditor
127
+ valueSpecification={milestoningParameter}
128
+ graph={queryBuilderState.graphManagerState.graph}
129
+ setValueSpecification={(val: ValueSpecification): void =>
130
+ stereotype === MILESTONING_STEREOTYPE.BUSINESS_TEMPORAL
131
+ ? queryBuilderState.querySetupState.setBusinessDate(val)
132
+ : queryBuilderState.querySetupState.setProcessingDate(val)
133
+ }
134
+ typeCheckOption={{
135
+ expectedType:
136
+ queryBuilderState.graphManagerState.graph.getPrimitiveType(
137
+ PRIMITIVE_TYPE.DATE,
138
+ ),
139
+ }}
140
+ resetValue={resetMilestoningParameter}
141
+ />
142
+ </PanelEntryDropZonePlaceholder>
143
143
  </div>
144
144
  );
145
145
  },
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Copyright (c) 2020-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { TimesCircleIcon } from '@finos/legend-art';
18
+
19
+ export const QueryBuilderPanelIssueCountBadge: React.FC<{
20
+ issues: string[] | undefined;
21
+ }> = (props) => {
22
+ const { issues } = props;
23
+ if (!issues) {
24
+ return null;
25
+ }
26
+ const labelText = `${issues.length} issue${issues.length > 1 ? 's' : ''}`;
27
+ return (
28
+ <div
29
+ className="query-builder-panel-issue-count-badge"
30
+ title={`Found ${labelText}:\n${issues
31
+ .map((issue) => `\u2022 ${issue}`)
32
+ .join('\n')}`}
33
+ >
34
+ <TimesCircleIcon className="query-builder-panel-issue-count-badge__icon" />
35
+ {labelText}
36
+ </div>
37
+ );
38
+ };
@@ -14,6 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
+ import { useState } from 'react';
17
18
  import { observer } from 'mobx-react-lite';
18
19
  import type { QueryBuilderState } from '../stores/QueryBuilderState.js';
19
20
  import {
@@ -25,12 +26,13 @@ import {
25
26
  DollarIcon,
26
27
  PlusIcon,
27
28
  InputWithInlineValidation,
29
+ DragPreviewLayer,
30
+ useDragPreviewLayer,
28
31
  } from '@finos/legend-art';
29
32
  import {
30
33
  type QueryBuilderParameterDragSource,
31
- QUERY_BUILDER_PARAMETER_TREE_DND_TYPE,
34
+ QUERY_BUILDER_PARAMETER_DND_TYPE,
32
35
  } from '../stores/QueryParametersState.js';
33
- import { useEffect, useState } from 'react';
34
36
  import {
35
37
  type Type,
36
38
  MULTIPLICITY_INFINITE,
@@ -47,9 +49,9 @@ import {
47
49
  LambdaParameterState,
48
50
  LambdaParameterValuesEditor,
49
51
  getPackageableElementOptionFormatter,
52
+ useApplicationStore,
50
53
  } from '@finos/legend-application';
51
- import { useDrag, useDragLayer } from 'react-dnd';
52
- import { getEmptyImage } from 'react-dnd-html5-backend';
54
+ import { useDrag } from 'react-dnd';
53
55
  import { generateEnumerableNameFromToken } from '@finos/legend-shared';
54
56
  import { DEFAULT_VARIABLE_NAME } from '../QueryBuilder_Const.js';
55
57
 
@@ -60,6 +62,7 @@ const VariableExpressionEditor = observer(
60
62
  }) => {
61
63
  // main state
62
64
  const { queryBuilderState, lambdaParameterState } = props;
65
+ const applicationStore = useApplicationStore();
63
66
  const queryParametersState = queryBuilderState.queryParametersState;
64
67
  const isCreating =
65
68
  !queryParametersState.parameterStates.includes(lambdaParameterState);
@@ -145,6 +148,7 @@ const VariableExpressionEditor = observer(
145
148
  }
146
149
  close();
147
150
  };
151
+
148
152
  return (
149
153
  <Dialog
150
154
  open={Boolean(lambdaParameterState)}
@@ -192,10 +196,9 @@ const VariableExpressionEditor = observer(
192
196
  options={typeOptions}
193
197
  onChange={changeType}
194
198
  value={selectedType}
195
- darkMode={true}
199
+ darkMode={!applicationStore.TEMPORARY__isLightThemeEnabled}
196
200
  formatOptionLabel={getPackageableElementOptionFormatter({
197
- darkMode: true,
198
- graphManagerState: queryBuilderState.graphManagerState,
201
+ darkMode: !applicationStore.TEMPORARY__isLightThemeEnabled,
199
202
  })}
200
203
  />
201
204
  </div>
@@ -243,47 +246,6 @@ const VariableExpressionEditor = observer(
243
246
  },
244
247
  );
245
248
 
246
- const QueryBuilderParameterDragLayer = observer(
247
- (props: { queryBuilderState: QueryBuilderState }) => {
248
- const { itemType, item, isDragging, currentPosition } = useDragLayer(
249
- (monitor) => ({
250
- itemType:
251
- monitor.getItemType() as QUERY_BUILDER_PARAMETER_TREE_DND_TYPE,
252
- item: monitor.getItem<QueryBuilderParameterDragSource | null>(),
253
- isDragging: monitor.isDragging(),
254
- initialOffset: monitor.getInitialSourceClientOffset(),
255
- currentPosition: monitor.getClientOffset(),
256
- }),
257
- );
258
-
259
- if (
260
- !isDragging ||
261
- !item ||
262
- !Object.values(QUERY_BUILDER_PARAMETER_TREE_DND_TYPE).includes(itemType)
263
- ) {
264
- return null;
265
- }
266
- return (
267
- <div className="query-builder__parameters__drag-preview-layer">
268
- <div
269
- className="query-builder__parameters__drag-preview"
270
- style={
271
- !currentPosition
272
- ? { display: 'none' }
273
- : {
274
- transform: `translate(${currentPosition.x + 20}px, ${
275
- currentPosition.y + 10
276
- }px)`,
277
- }
278
- }
279
- >
280
- {item.variable.variableName}
281
- </div>
282
- </div>
283
- );
284
- },
285
- );
286
-
287
249
  export const VariableExpressionViewer = observer(
288
250
  (props: {
289
251
  queryBuilderState: QueryBuilderState;
@@ -302,18 +264,23 @@ export const VariableExpressionViewer = observer(
302
264
  queryParameterState.removeParameter(variableExpressionState);
303
265
  const [, dragConnector, dragPreviewConnector] = useDrag(
304
266
  () => ({
305
- type: QUERY_BUILDER_PARAMETER_TREE_DND_TYPE.VARIABLE,
267
+ type: QUERY_BUILDER_PARAMETER_DND_TYPE,
306
268
  item: { variable: variableExpressionState },
307
269
  }),
308
270
  [variableExpressionState],
309
271
  );
310
- // hide default HTML5 preview image
311
- useEffect(() => {
312
- dragPreviewConnector(getEmptyImage(), { captureDraggingState: true });
313
- }, [dragPreviewConnector]);
272
+ useDragPreviewLayer(dragPreviewConnector);
273
+
314
274
  return (
315
275
  <div className="query-builder__parameters__parameter" ref={dragConnector}>
316
- <QueryBuilderParameterDragLayer queryBuilderState={queryBuilderState} />
276
+ <DragPreviewLayer
277
+ labelGetter={(item: QueryBuilderParameterDragSource): string =>
278
+ item.variable.variableName === ''
279
+ ? '(unknown)'
280
+ : item.variable.variableName
281
+ }
282
+ types={[QUERY_BUILDER_PARAMETER_DND_TYPE]}
283
+ />
317
284
  <div className="query-builder__parameters__parameter__content">
318
285
  <div className="query-builder__parameters__parameter__icon">
319
286
  <div className="query-builder__parameters__parameter-icon">