@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
@@ -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(
@@ -968,8 +924,13 @@ export const QueryBuilderExplorerPanel = observer(
968
924
  explorerState.mappingModelCoverageAnalysisState.isInProgress
969
925
  }
970
926
  />
971
- <QueryBuilderExplorerPropertyDragLayer
972
- 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)}
973
934
  />
974
935
  {explorerState.mappingModelCoverageAnalysisState.isInProgress ? (
975
936
  <BlankPanelContent>
@@ -34,6 +34,7 @@ import {
34
34
  } from '@finos/legend-application';
35
35
  import { QueryBuilderProjectionState } from '../stores/QueryBuilderProjectionState.js';
36
36
  import { QueryBuilderGraphFetchTreeState } from '../stores/QueryBuilderGraphFetchTreeState.js';
37
+ import { QueryBuilderPanelIssueCountBadge } from './QueryBuilderPanelIssueCountBadge.js';
37
38
 
38
39
  const QueryBuilderUnsupportedFetchStructure = observer(
39
40
  (props: { mode: FETCH_STRUCTURE_MODE }) => {
@@ -89,87 +90,96 @@ export const QueryBuilderFetchStructurePanel = observer(
89
90
  const onChangeFetchStructureMode =
90
91
  (fetchMode: FETCH_STRUCTURE_MODE): (() => void) =>
91
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
+ };
92
102
  if (fetchStructureState.fetchStructureMode !== fetchMode) {
93
- if (
94
- fetchMode === FETCH_STRUCTURE_MODE.GRAPH_FETCH &&
95
- queryBuilderState.fetchStructureState.projectionState.columns
96
- .length > 0
97
- ) {
98
- applicationStore.setActionAlertInfo({
99
- message:
100
- queryBuilderState.showPostFilterPanel &&
101
- queryBuilderState.postFilterState.nodes.size > 0
102
- ? 'With graph fetch, post filter is not supported. Current projection columns and post filters will be lost when switching to the graph fetch panel. Do you still want to proceed?'
103
- : 'Current projection columns will be lost when switching to the graph fetch panel. Do you still want to proceed?',
104
- type: ActionAlertType.CAUTION,
105
- actions: [
106
- {
107
- label: 'Proceed',
108
- type: ActionAlertActionType.PROCEED_WITH_CAUTION,
109
- handler: applicationStore.guardUnhandledError(async () => {
110
- fetchStructureState.setFetchStructureMode(fetchMode);
111
- queryBuilderState.changeFetchStructure();
112
- queryBuilderState.fetchStructureState.projectionState =
113
- new QueryBuilderProjectionState(
114
- queryBuilderState,
115
- queryBuilderState.fetchStructureState.projectionState.aggregationState.operators,
116
- );
117
- queryBuilderState.postFilterState =
118
- new QueryBuilderPostFilterState(
119
- queryBuilderState,
120
- queryBuilderState.postFilterOperators,
121
- );
122
- queryBuilderState.setShowPostFilterPanel(false);
123
- }),
124
- },
125
- {
126
- label: 'Cancel',
127
- type: ActionAlertActionType.PROCEED,
128
- default: true,
129
- },
130
- ],
131
- });
132
- } else if (
133
- fetchMode === FETCH_STRUCTURE_MODE.PROJECTION &&
134
- queryBuilderState.fetchStructureState.graphFetchTreeState.treeData
135
- ?.rootIds.length
136
- ) {
137
- applicationStore.setActionAlertInfo({
138
- message:
139
- 'Current graph fetch nodes will be lost when switching to the projection panel. Do you still want to proceed?',
140
- type: ActionAlertType.CAUTION,
141
- actions: [
142
- {
143
- label: 'Proceed',
144
- type: ActionAlertActionType.PROCEED_WITH_CAUTION,
145
- handler: applicationStore.guardUnhandledError(async () => {
146
- fetchStructureState.setFetchStructureMode(fetchMode);
147
- queryBuilderState.changeFetchStructure();
148
- queryBuilderState.fetchStructureState.graphFetchTreeState =
149
- new QueryBuilderGraphFetchTreeState(queryBuilderState);
150
- queryBuilderState.postFilterState =
151
- new QueryBuilderPostFilterState(
152
- queryBuilderState,
153
- queryBuilderState.postFilterOperators,
154
- );
155
- queryBuilderState.setShowPostFilterPanel(false);
156
- }),
157
- },
158
- {
159
- label: 'Cancel',
160
- type: ActionAlertActionType.PROCEED,
161
- default: true,
162
- },
163
- ],
164
- });
165
- } else {
166
- fetchStructureState.setFetchStructureMode(fetchMode);
167
- queryBuilderState.changeFetchStructure();
168
- queryBuilderState.postFilterState = new QueryBuilderPostFilterState(
169
- queryBuilderState,
170
- queryBuilderState.postFilterOperators,
171
- );
172
- 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;
180
+ }
181
+ default:
182
+ return;
173
183
  }
174
184
  }
175
185
  };
@@ -179,6 +189,9 @@ export const QueryBuilderFetchStructurePanel = observer(
179
189
  <div className="panel__header">
180
190
  <div className="panel__header__title">
181
191
  <div className="panel__header__title__label">fetch structure</div>
192
+ <QueryBuilderPanelIssueCountBadge
193
+ issues={fetchStructureState.validationIssues}
194
+ />
182
195
  </div>
183
196
  <div className="panel__header__actions">
184
197
  {fetchStructureStateMode === FETCH_STRUCTURE_MODE.PROJECTION && (