@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
@@ -176,7 +176,13 @@ export const QueryBuilder = observer(
176
176
  Show Function(s)
177
177
  </MenuContentItemLabel>
178
178
  </MenuContentItem>
179
- <MenuContentItem onClick={toggleShowParameterPanel}>
179
+ <MenuContentItem
180
+ onClick={toggleShowParameterPanel}
181
+ disabled={
182
+ queryBuilderState.queryParametersState.parameterStates
183
+ .length > 0
184
+ }
185
+ >
180
186
  <MenuContentItemIcon>
181
187
  {queryBuilderState.showParameterPanel ? (
182
188
  <CheckIcon />
@@ -188,7 +194,12 @@ export const QueryBuilder = observer(
188
194
  </MenuContentItem>
189
195
  <MenuContentItem
190
196
  onClick={toggleShowPostFilterPanel}
191
- disabled={queryBuilderState.fetchStructureState.isGraphFetchMode()}
197
+ disabled={
198
+ queryBuilderState.fetchStructureState.isGraphFetchMode() ||
199
+ Array.from(
200
+ queryBuilderState.postFilterState.nodes.values(),
201
+ ).length > 0
202
+ }
192
203
  >
193
204
  <MenuContentItemIcon>
194
205
  {queryBuilderState.showPostFilterPanel ? (
@@ -46,6 +46,8 @@ import {
46
46
  CheckIcon,
47
47
  SearchIcon,
48
48
  PanelLoadingIndicator,
49
+ DragPreviewLayer,
50
+ useDragPreviewLayer,
49
51
  } from '@finos/legend-art';
50
52
  import {
51
53
  type QueryBuilderExplorerTreeDragSource,
@@ -58,9 +60,8 @@ import {
58
60
  getQueryBuilderPropertyNodeData,
59
61
  getQueryBuilderSubTypeNodeData,
60
62
  } from '../stores/QueryBuilderExplorerState.js';
61
- import { useDrag, useDragLayer } from 'react-dnd';
63
+ import { useDrag } from 'react-dnd';
62
64
  import { QueryBuilderPropertyInfoTooltip } from './QueryBuilderPropertyInfoTooltip.js';
63
- import { getEmptyImage } from 'react-dnd-html5-backend';
64
65
  import type { QueryBuilderState } from '../stores/QueryBuilderState.js';
65
66
  import { addQueryBuilderPropertyNode } from '../stores/QueryBuilderGraphFetchTreeUtil.js';
66
67
  import { QueryBuilderSimpleProjectionColumnState } from '../stores/QueryBuilderProjectionState.js';
@@ -233,51 +234,6 @@ const QueryBuilderExplorerPreviewDataModal = observer(
233
234
  },
234
235
  );
235
236
 
236
- const QueryBuilderExplorerPropertyDragLayer = observer(
237
- (props: { queryBuilderState: QueryBuilderState }) => {
238
- const { queryBuilderState } = props;
239
- const explorerState = queryBuilderState.explorerState;
240
- const { itemType, item, isDragging, currentPosition } = useDragLayer(
241
- (monitor) => ({
242
- itemType: monitor.getItemType() as QUERY_BUILDER_EXPLORER_TREE_DND_TYPE,
243
- item: monitor.getItem<QueryBuilderExplorerTreeDragSource | null>(),
244
- isDragging: monitor.isDragging(),
245
- initialOffset: monitor.getInitialSourceClientOffset(),
246
- currentPosition: monitor.getClientOffset(),
247
- }),
248
- );
249
-
250
- if (
251
- !isDragging ||
252
- !item ||
253
- !Object.values(QUERY_BUILDER_EXPLORER_TREE_DND_TYPE).includes(itemType)
254
- ) {
255
- return null;
256
- }
257
- return (
258
- <div className="query-builder-explorer-tree__drag-preview-layer">
259
- <div
260
- className="query-builder-explorer-tree__drag-preview"
261
- // added some offset so the mouse doesn't overlap the label too much
262
- style={
263
- !currentPosition
264
- ? { display: 'none' }
265
- : {
266
- transform: `translate(${currentPosition.x + 20}px, ${
267
- currentPosition.y + 10
268
- }px)`,
269
- }
270
- }
271
- >
272
- {explorerState.humanizePropertyName
273
- ? prettyPropertyName(item.node.label)
274
- : item.node.label}
275
- </div>
276
- </div>
277
- );
278
- },
279
- );
280
-
281
237
  const QueryBuilderExplorerContextMenu = observer(
282
238
  forwardRef<
283
239
  HTMLDivElement,
@@ -442,7 +398,9 @@ const QueryBuilderExplorerTreeNodeContainer = observer(
442
398
  useState(false);
443
399
  const applicationStore = useApplicationStore();
444
400
  const explorerState = queryBuilderState.explorerState;
445
- const [, dragConnector, dragPreviewConnector] = useDrag(
401
+ const [, dragConnector, dragPreviewConnector] = useDrag<{
402
+ node?: QueryBuilderExplorerTreePropertyNodeData;
403
+ }>(
446
404
  () => ({
447
405
  type:
448
406
  node instanceof QueryBuilderExplorerTreePropertyNodeData
@@ -452,13 +410,15 @@ const QueryBuilderExplorerTreeNodeContainer = observer(
452
410
  ? QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.CLASS_PROPERTY
453
411
  : QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY
454
412
  : QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ROOT,
455
- item: (): { node?: QueryBuilderExplorerTreePropertyNodeData } =>
413
+ item: () =>
456
414
  node instanceof QueryBuilderExplorerTreePropertyNodeData
457
415
  ? { node }
458
416
  : {},
459
417
  }),
460
418
  [node],
461
419
  );
420
+ useDragPreviewLayer(dragPreviewConnector);
421
+
462
422
  const isExpandable = Boolean(node.childrenIds.length);
463
423
  const isDerivedProperty =
464
424
  node instanceof QueryBuilderExplorerTreePropertyNodeData &&
@@ -506,10 +466,6 @@ const QueryBuilderExplorerTreeNodeContainer = observer(
506
466
  ).catch(applicationStore.alertUnhandledError);
507
467
  }
508
468
  };
509
- // hide default HTML5 preview image
510
- useEffect(() => {
511
- dragPreviewConnector(getEmptyImage(), { captureDraggingState: true });
512
- }, [dragPreviewConnector]);
513
469
 
514
470
  if (!node.mappingData.mapped && !explorerState.showUnmappedProperties) {
515
471
  return null;
@@ -595,7 +551,7 @@ const QueryBuilderExplorerTreeNodeContainer = observer(
595
551
  >
596
552
  <div
597
553
  className={clsx(
598
- 'query-builder-explorer-tree__node__label--property--name',
554
+ 'query-builder-explorer-tree__node__label--property__name',
599
555
  {
600
556
  'query-builder-explorer-tree__node__label--deprecated':
601
557
  checkForDeprecatedNode(
@@ -777,7 +733,9 @@ const QueryBuilderExplorerTree = observer(
777
733
  explorerState.mappingModelCoverageAnalysisResult,
778
734
  ),
779
735
  );
780
- treeData.nodes.set(propertyTreeNodeData.id, propertyTreeNodeData);
736
+ if (propertyTreeNodeData) {
737
+ treeData.nodes.set(propertyTreeNodeData.id, propertyTreeNodeData);
738
+ }
781
739
  });
782
740
  node.type._subclasses.forEach((subclass) => {
783
741
  const subTypeTreeNodeData = getQueryBuilderSubTypeNodeData(
@@ -966,8 +924,13 @@ export const QueryBuilderExplorerPanel = observer(
966
924
  explorerState.mappingModelCoverageAnalysisState.isInProgress
967
925
  }
968
926
  />
969
- <QueryBuilderExplorerPropertyDragLayer
970
- queryBuilderState={queryBuilderState}
927
+ <DragPreviewLayer
928
+ labelGetter={(item: QueryBuilderExplorerTreeDragSource): string =>
929
+ explorerState.humanizePropertyName
930
+ ? prettyPropertyName(item.node.label)
931
+ : item.node.label
932
+ }
933
+ types={Object.values(QUERY_BUILDER_EXPLORER_TREE_DND_TYPE)}
971
934
  />
972
935
  {explorerState.mappingModelCoverageAnalysisState.isInProgress ? (
973
936
  <BlankPanelContent>
@@ -32,6 +32,9 @@ import {
32
32
  ActionAlertType,
33
33
  useApplicationStore,
34
34
  } from '@finos/legend-application';
35
+ import { QueryBuilderProjectionState } from '../stores/QueryBuilderProjectionState.js';
36
+ import { QueryBuilderGraphFetchTreeState } from '../stores/QueryBuilderGraphFetchTreeState.js';
37
+ import { QueryBuilderPanelIssueCountBadge } from './QueryBuilderPanelIssueCountBadge.js';
35
38
 
36
39
  const QueryBuilderUnsupportedFetchStructure = observer(
37
40
  (props: { mode: FETCH_STRUCTURE_MODE }) => {
@@ -87,49 +90,96 @@ export const QueryBuilderFetchStructurePanel = observer(
87
90
  const onChangeFetchStructureMode =
88
91
  (fetchMode: FETCH_STRUCTURE_MODE): (() => void) =>
89
92
  (): void => {
93
+ const reset = (): void => {
94
+ fetchStructureState.setFetchStructureMode(fetchMode);
95
+ queryBuilderState.changeFetchStructure();
96
+ queryBuilderState.postFilterState = new QueryBuilderPostFilterState(
97
+ queryBuilderState,
98
+ queryBuilderState.postFilterOperators,
99
+ );
100
+ queryBuilderState.setShowPostFilterPanel(false);
101
+ };
90
102
  if (fetchStructureState.fetchStructureMode !== fetchMode) {
91
- // TODO: might want to add alert modal to alert user changing fetch structure resets state
92
- if (
93
- fetchMode === FETCH_STRUCTURE_MODE.GRAPH_FETCH &&
94
- queryBuilderState.showPostFilterPanel &&
95
- queryBuilderState.postFilterState.nodes.size > 0
96
- ) {
97
- applicationStore.setActionAlertInfo({
98
- message:
99
- 'With graph fetch, post filter is not supported. Current post filters will be lost when switching to the graph fetch panel. Do you still want to proceed?',
100
- type: ActionAlertType.CAUTION,
101
- actions: [
102
- {
103
- label: 'Proceed',
104
- type: ActionAlertActionType.PROCEED_WITH_CAUTION,
105
- handler: applicationStore.guardUnhandledError(async () => {
106
- fetchStructureState.setFetchStructureMode(fetchMode);
107
- queryBuilderState.changeFetchStructure();
108
- queryBuilderState.postFilterState =
109
- new QueryBuilderPostFilterState(
110
- queryBuilderState,
111
- queryBuilderState.postFilterOperators,
112
- );
113
- queryBuilderState.setShowPostFilterPanel(false);
114
- }),
115
- },
116
- {
117
- label: 'Cancel',
118
- type: ActionAlertActionType.PROCEED,
119
- default: true,
120
- },
121
- ],
122
- });
123
- } else {
124
- fetchStructureState.setFetchStructureMode(fetchMode);
125
- queryBuilderState.changeFetchStructure();
126
- queryBuilderState.postFilterState = new QueryBuilderPostFilterState(
127
- queryBuilderState,
128
- queryBuilderState.postFilterOperators,
129
- );
130
- if (fetchMode === FETCH_STRUCTURE_MODE.GRAPH_FETCH) {
131
- queryBuilderState.setShowPostFilterPanel(false);
103
+ switch (fetchMode) {
104
+ case FETCH_STRUCTURE_MODE.GRAPH_FETCH: {
105
+ if (
106
+ queryBuilderState.fetchStructureState.projectionState.columns
107
+ .length > 0
108
+ // NOTE: here we could potentially check for the presence of post-filter as well
109
+ // but we make the assumption that if there is no projection column, there should
110
+ // not be any post-filter at all
111
+ ) {
112
+ applicationStore.setActionAlertInfo({
113
+ message:
114
+ queryBuilderState.showPostFilterPanel &&
115
+ queryBuilderState.postFilterState.nodes.size > 0
116
+ ? 'With graph-fetch mode, post filter is not supported. Current projection columns and post filters will be lost when switching to the graph-fetch mode. Do you still want to proceed?'
117
+ : 'Current projection columns will be lost when switching to the graph-fetch mode. Do you still want to proceed?',
118
+ type: ActionAlertType.CAUTION,
119
+ actions: [
120
+ {
121
+ label: 'Proceed',
122
+ type: ActionAlertActionType.PROCEED_WITH_CAUTION,
123
+ handler: applicationStore.guardUnhandledError(
124
+ async () => {
125
+ queryBuilderState.fetchStructureState.projectionState =
126
+ new QueryBuilderProjectionState(
127
+ queryBuilderState,
128
+ queryBuilderState.fetchStructureState.projectionState.aggregationState.operators,
129
+ );
130
+ reset();
131
+ },
132
+ ),
133
+ },
134
+ {
135
+ label: 'Cancel',
136
+ type: ActionAlertActionType.PROCEED,
137
+ default: true,
138
+ },
139
+ ],
140
+ });
141
+ } else {
142
+ reset();
143
+ }
144
+ return;
145
+ }
146
+ case FETCH_STRUCTURE_MODE.PROJECTION: {
147
+ if (
148
+ queryBuilderState.fetchStructureState.graphFetchTreeState
149
+ .treeData?.rootIds.length
150
+ ) {
151
+ applicationStore.setActionAlertInfo({
152
+ message:
153
+ 'Current graph-fetch will be lost when switching to projection mode. Do you still want to proceed?',
154
+ type: ActionAlertType.CAUTION,
155
+ actions: [
156
+ {
157
+ label: 'Proceed',
158
+ type: ActionAlertActionType.PROCEED_WITH_CAUTION,
159
+ handler: applicationStore.guardUnhandledError(
160
+ async () => {
161
+ queryBuilderState.fetchStructureState.graphFetchTreeState =
162
+ new QueryBuilderGraphFetchTreeState(
163
+ queryBuilderState,
164
+ );
165
+ reset();
166
+ },
167
+ ),
168
+ },
169
+ {
170
+ label: 'Cancel',
171
+ type: ActionAlertActionType.PROCEED,
172
+ default: true,
173
+ },
174
+ ],
175
+ });
176
+ } else {
177
+ reset();
178
+ }
179
+ return;
132
180
  }
181
+ default:
182
+ return;
133
183
  }
134
184
  }
135
185
  };
@@ -139,6 +189,9 @@ export const QueryBuilderFetchStructurePanel = observer(
139
189
  <div className="panel__header">
140
190
  <div className="panel__header__title">
141
191
  <div className="panel__header__title__label">fetch structure</div>
192
+ <QueryBuilderPanelIssueCountBadge
193
+ issues={fetchStructureState.validationIssues}
194
+ />
142
195
  </div>
143
196
  <div className="panel__header__actions">
144
197
  {fetchStructureStateMode === FETCH_STRUCTURE_MODE.PROJECTION && (