@finos/legend-query-builder 4.15.29 → 4.15.31

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. package/lib/components/QueryBuilder.js +4 -4
  2. package/lib/components/QueryBuilder.js.map +1 -1
  3. package/lib/components/QueryBuilderPropertyExpressionEditor.js +2 -2
  4. package/lib/components/QueryBuilderPropertyExpressionEditor.js.map +1 -1
  5. package/lib/components/QueryBuilderSideBar.js +1 -1
  6. package/lib/components/QueryBuilderSideBar.js.map +1 -1
  7. package/lib/components/QueryBuilder_LegendApplicationPlugin.d.ts.map +1 -1
  8. package/lib/components/QueryBuilder_LegendApplicationPlugin.js +0 -2
  9. package/lib/components/QueryBuilder_LegendApplicationPlugin.js.map +1 -1
  10. package/lib/components/QueryLoader.js +1 -1
  11. package/lib/components/QueryLoader.js.map +1 -1
  12. package/lib/components/data-access/DataAccessOverview.d.ts.map +1 -1
  13. package/lib/components/data-access/DataAccessOverview.js +56 -30
  14. package/lib/components/data-access/DataAccessOverview.js.map +1 -1
  15. package/lib/components/execution-plan/ExecutionPlanViewer.js +1 -1
  16. package/lib/components/execution-plan/ExecutionPlanViewer.js.map +1 -1
  17. package/lib/components/explorer/QueryBuilderExplorerPanel.js +3 -1
  18. package/lib/components/explorer/QueryBuilderExplorerPanel.js.map +1 -1
  19. package/lib/components/explorer/QueryBuilderFunctionsExplorerPanel.d.ts.map +1 -1
  20. package/lib/components/explorer/QueryBuilderFunctionsExplorerPanel.js +7 -3
  21. package/lib/components/explorer/QueryBuilderFunctionsExplorerPanel.js.map +1 -1
  22. package/lib/components/explorer/QueryBuilderMilestoningParameterEditor.d.ts.map +1 -1
  23. package/lib/components/explorer/QueryBuilderMilestoningParameterEditor.js +4 -2
  24. package/lib/components/explorer/QueryBuilderMilestoningParameterEditor.js.map +1 -1
  25. package/lib/components/explorer/QueryBuilderPropertySearchPanel.d.ts.map +1 -1
  26. package/lib/components/explorer/QueryBuilderPropertySearchPanel.js +4 -2
  27. package/lib/components/explorer/QueryBuilderPropertySearchPanel.js.map +1 -1
  28. package/lib/components/fetch-structure/QueryBuilderAggParam.d.ts.map +1 -1
  29. package/lib/components/fetch-structure/QueryBuilderAggParam.js +5 -2
  30. package/lib/components/fetch-structure/QueryBuilderAggParam.js.map +1 -1
  31. package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js +2 -2
  32. package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js.map +1 -1
  33. package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.d.ts.map +1 -1
  34. package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js +11 -9
  35. package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js.map +1 -1
  36. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js +2 -2
  37. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js.map +1 -1
  38. package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts.map +1 -1
  39. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js +16 -10
  40. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js.map +1 -1
  41. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.d.ts.map +1 -1
  42. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js +13 -9
  43. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js.map +1 -1
  44. package/lib/components/filter/QueryBuilderFilterPanel.d.ts.map +1 -1
  45. package/lib/components/filter/QueryBuilderFilterPanel.js +14 -16
  46. package/lib/components/filter/QueryBuilderFilterPanel.js.map +1 -1
  47. package/lib/components/result/tds/QueryBuilderTDSGridResult.d.ts.map +1 -1
  48. package/lib/components/result/tds/QueryBuilderTDSGridResult.js.map +1 -1
  49. package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.d.ts +2 -1
  50. package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.d.ts.map +1 -1
  51. package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.js +7 -62
  52. package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.js.map +1 -1
  53. package/lib/components/shared/BasicValueSpecificationEditor.d.ts +1 -1
  54. package/lib/components/shared/BasicValueSpecificationEditor.d.ts.map +1 -1
  55. package/lib/components/shared/BasicValueSpecificationEditor.js +1 -1
  56. package/lib/components/shared/BasicValueSpecificationEditor.js.map +1 -1
  57. package/lib/components/shared/QueryBuilderPropertyInfoTooltip.d.ts +1 -1
  58. package/lib/components/shared/QueryBuilderPropertyInfoTooltip.d.ts.map +1 -1
  59. package/lib/components/shared/QueryBuilderVariableSelector.d.ts.map +1 -1
  60. package/lib/components/shared/QueryBuilderVariableSelector.js +4 -2
  61. package/lib/components/shared/QueryBuilderVariableSelector.js.map +1 -1
  62. package/lib/index.css +1 -1
  63. package/lib/package.json +12 -13
  64. package/lib/stores/QueryBuilderStateBuilder.d.ts.map +1 -1
  65. package/lib/stores/QueryBuilderStateBuilder.js +0 -1
  66. package/lib/stores/QueryBuilderStateBuilder.js.map +1 -1
  67. package/lib/stores/QueryLoaderState.js +1 -1
  68. package/lib/stores/QueryLoaderState.js.map +1 -1
  69. package/lib/stores/explorer/QueryBuilderExplorerState.d.ts +1 -1
  70. package/lib/stores/explorer/QueryBuilderExplorerState.d.ts.map +1 -1
  71. package/lib/stores/explorer/QueryBuilderExplorerState.js.map +1 -1
  72. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeUtil.d.ts.map +1 -1
  73. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeUtil.js.map +1 -1
  74. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts.map +1 -1
  75. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js +1 -3
  76. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js.map +1 -1
  77. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.d.ts.map +1 -1
  78. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js +0 -1
  79. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js.map +1 -1
  80. package/package.json +22 -23
  81. package/src/components/QueryBuilder.tsx +4 -4
  82. package/src/components/QueryBuilderPropertyExpressionEditor.tsx +2 -2
  83. package/src/components/QueryBuilderSideBar.tsx +1 -1
  84. package/src/components/QueryBuilder_LegendApplicationPlugin.ts +0 -3
  85. package/src/components/QueryLoader.tsx +1 -1
  86. package/src/components/data-access/DataAccessOverview.tsx +62 -36
  87. package/src/components/execution-plan/ExecutionPlanViewer.tsx +1 -1
  88. package/src/components/explorer/QueryBuilderExplorerPanel.tsx +3 -3
  89. package/src/components/explorer/QueryBuilderFunctionsExplorerPanel.tsx +7 -6
  90. package/src/components/explorer/QueryBuilderMilestoningParameterEditor.tsx +5 -2
  91. package/src/components/explorer/QueryBuilderPropertySearchPanel.tsx +4 -3
  92. package/src/components/fetch-structure/QueryBuilderAggParam.tsx +5 -4
  93. package/src/components/fetch-structure/QueryBuilderGraphFetchTreePanel.tsx +2 -2
  94. package/src/components/fetch-structure/QueryBuilderPostFilterPanel.tsx +13 -10
  95. package/src/components/fetch-structure/QueryBuilderResultModifierPanel.tsx +2 -2
  96. package/src/components/fetch-structure/QueryBuilderTDSPanel.tsx +18 -13
  97. package/src/components/fetch-structure/QueryBuilderTDSWindowPanel.tsx +13 -12
  98. package/src/components/filter/QueryBuilderFilterPanel.tsx +15 -23
  99. package/src/components/result/tds/QueryBuilderTDSGridResult.tsx +4 -5
  100. package/src/components/result/tds/QueryBuilderTDSSimpleGridResult.tsx +19 -57
  101. package/src/components/shared/BasicValueSpecificationEditor.tsx +2 -2
  102. package/src/components/shared/QueryBuilderPropertyInfoTooltip.tsx +1 -1
  103. package/src/components/shared/QueryBuilderVariableSelector.tsx +4 -2
  104. package/src/stores/QueryBuilderStateBuilder.ts +0 -1
  105. package/src/stores/QueryLoaderState.ts +1 -1
  106. package/src/stores/explorer/QueryBuilderExplorerState.ts +1 -1
  107. package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeUtil.ts +1 -1
  108. package/src/stores/fetch-structure/tds/QueryBuilderTDSState.ts +13 -15
  109. package/src/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.ts +0 -1
@@ -27,7 +27,6 @@ import packageJson from '../../package.json' with { type: 'json' };
27
27
  import { QUERY_BUILDER_SETTING_CONFIG } from '../__lib__/QueryBuilderSetting.js';
28
28
  import { QUERY_BUILDER_COMMAND_CONFIG } from '../stores/QueryBuilderCommand.js';
29
29
  import type { QueryBuilderState } from '../stores/QueryBuilderState.js';
30
- import { configureDataGridComponent } from '@finos/legend-lego/data-grid';
31
30
  import { Chart as ChartJS, ArcElement, Tooltip, LinearScale } from 'chart.js';
32
31
 
33
32
  export type CheckEntitlementEditorRender = (
@@ -50,8 +49,6 @@ export class QueryBuilder_LegendApplicationPlugin extends LegendApplicationPlugi
50
49
  override getExtraApplicationSetups(): LegendApplicationSetup[] {
51
50
  return [
52
51
  async (applicationStore) => {
53
- configureDataGridComponent();
54
-
55
52
  // configure chart component
56
53
  ChartJS.register(
57
54
  ArcElement,
@@ -203,7 +203,7 @@ export const QueryLoader = observer(
203
203
  debouncedLoadQueries(queryLoaderState.searchText);
204
204
  };
205
205
  const toggleCuratedTemplate = (): void => {
206
- Array.from(queryLoaderState.extraFilters).map(([key, value]) =>
206
+ Array.from(queryLoaderState.extraFilters).forEach(([key, value]) =>
207
207
  queryLoaderState.extraFilters.set(key, false),
208
208
  );
209
209
  queryLoaderState.setShowCurrentUserQueriesOnly(false);
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { useEffect } from 'react';
17
+ import { useEffect, useRef } from 'react';
18
18
  import { observer } from 'mobx-react-lite';
19
19
  import { useApplicationStore } from '@finos/legend-application';
20
20
  import type {
@@ -42,7 +42,6 @@ import {
42
42
  DatasetEntitlementUnsupportedReport,
43
43
  } from '@finos/legend-graph';
44
44
  import { Chart as ChartJS, DoughnutController, ArcElement } from 'chart.js';
45
- import { Doughnut } from 'react-chartjs-2';
46
45
  import { getNullableFirstEntry } from '@finos/legend-shared';
47
46
  import type { QueryBuilder_LegendApplicationPlugin_Extension } from '../../stores/QueryBuilder_LegendApplicationPlugin_Extension.js';
48
47
 
@@ -51,6 +50,8 @@ ChartJS.register(DoughnutController, ArcElement);
51
50
  const DataAccessOverviewChart = observer(
52
51
  (props: { dataAccessState: DataAccessState }) => {
53
52
  const { dataAccessState } = props;
53
+ const canvasRef = useRef<HTMLCanvasElement>(null);
54
+ const chartRef = useRef<ChartJS>(null);
54
55
  const entitlementCheckInfo = dataAccessState.entitlementCheckInfo;
55
56
  const total = entitlementCheckInfo.total;
56
57
  const accessGrantedCount =
@@ -58,43 +59,68 @@ const DataAccessOverviewChart = observer(
58
59
  const accessGrantedPercentage =
59
60
  getNullableFirstEntry(entitlementCheckInfo.data)?.percentage ?? 0;
60
61
 
62
+ useEffect(() => {
63
+ if (canvasRef.current && !chartRef.current) {
64
+ chartRef.current = new ChartJS(canvasRef.current, {
65
+ type: 'doughnut',
66
+ data: {
67
+ labels: [],
68
+ datasets: [],
69
+ },
70
+ options: {
71
+ responsive: true,
72
+ resizeDelay: 0,
73
+ maintainAspectRatio: false,
74
+ cutout: '75%',
75
+ },
76
+ });
77
+ }
78
+
79
+ return () => {
80
+ chartRef.current?.destroy();
81
+ chartRef.current = null;
82
+ };
83
+ }, []);
84
+
85
+ useEffect(() => {
86
+ if (chartRef.current) {
87
+ chartRef.current.data = {
88
+ labels: entitlementCheckInfo.data.map((item) => item.label),
89
+ datasets: [
90
+ {
91
+ data: entitlementCheckInfo.data.map((item) => item.count),
92
+ backgroundColor: entitlementCheckInfo.data.map(
93
+ (item) => item.color,
94
+ ),
95
+ hoverBorderWidth: 0,
96
+ borderWidth: 0,
97
+ },
98
+ ],
99
+ };
100
+ chartRef.current.options = {
101
+ ...chartRef.current.options,
102
+ plugins: {
103
+ tooltip: {
104
+ enabled: entitlementCheckInfo.total !== 0,
105
+ usePointStyle: false,
106
+ boxPadding: 5,
107
+ callbacks: {
108
+ labelPointStyle: () => ({
109
+ pointStyle: 'rectRounded',
110
+ rotation: 0,
111
+ }),
112
+ },
113
+ },
114
+ },
115
+ };
116
+ chartRef.current.update('resize');
117
+ }
118
+ }, [entitlementCheckInfo]);
119
+
61
120
  return (
62
121
  <div className="data-access-overview__chart">
63
122
  <div className="data-access-overview__chart__container">
64
- <Doughnut
65
- data={{
66
- labels: entitlementCheckInfo.data.map((item) => item.label),
67
- datasets: [
68
- {
69
- data: entitlementCheckInfo.data.map((item) => item.count),
70
- backgroundColor: entitlementCheckInfo.data.map(
71
- (item) => item.color,
72
- ),
73
- hoverBorderWidth: 0,
74
- borderWidth: 0,
75
- },
76
- ],
77
- }}
78
- options={{
79
- responsive: true,
80
- resizeDelay: 0,
81
- maintainAspectRatio: false,
82
- cutout: '75%',
83
- plugins: {
84
- tooltip: {
85
- enabled: total !== 0,
86
- usePointStyle: false,
87
- boxPadding: 5,
88
- callbacks: {
89
- labelPointStyle: () => ({
90
- pointStyle: 'rectRounded',
91
- rotation: 0,
92
- }),
93
- },
94
- },
95
- },
96
- }}
97
- />
123
+ <canvas ref={canvasRef} />
98
124
  <div className="data-access-overview__chart__stats">
99
125
  <div className="data-access-overview__chart__stats__percentage">
100
126
  {total === 0 ? 0 : accessGrantedPercentage}%
@@ -288,7 +288,7 @@ export const ExecutionPlanViewerPanelContent: React.FC<{
288
288
  <div className="query-builder__template--function--editor__code">
289
289
  <CodeEditor
290
290
  inputValue={templateFunctions.reduce(
291
- (total, func) => (total += `${func}\n`),
291
+ (total, func) => `${total}${func}\n`,
292
292
  '',
293
293
  )}
294
294
  isReadOnly={true}
@@ -482,6 +482,8 @@ const QueryBuilderExplorerTreeNodeContainer = observer(
482
482
  }),
483
483
  [node],
484
484
  );
485
+ const ref = useRef<HTMLDivElement>(null);
486
+ dragConnector(ref);
485
487
  useDragPreviewLayer(dragPreviewConnector);
486
488
 
487
489
  const isExpandable = Boolean(node.childrenIds.length);
@@ -584,9 +586,7 @@ const QueryBuilderExplorerTreeNodeContainer = observer(
584
586
  : undefined
585
587
  }
586
588
  onClick={selectNode}
587
- ref={
588
- node.mappingData.mapped && !isExpandable ? dragConnector : undefined
589
- }
589
+ ref={node.mappingData.mapped && !isExpandable ? ref : undefined}
590
590
  style={{
591
591
  paddingLeft: `${(level - 1) * (stepPaddingInRem ?? 1) + 0.5}rem`,
592
592
  display: 'flex',
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { useEffect, useState } from 'react';
17
+ import { useEffect, useRef, useState } from 'react';
18
18
  import { observer } from 'mobx-react-lite';
19
19
  import {
20
20
  type TooltipPlacement,
@@ -168,13 +168,12 @@ const QueryBuilderFunctionsExplorerListEntry = observer(
168
168
  }),
169
169
  [node],
170
170
  );
171
+ const ref = useRef<HTMLDivElement>(null);
172
+ dragConnector(ref);
171
173
  useDragPreviewLayer(dragPreviewConnector);
172
174
 
173
175
  return (
174
- <div
175
- className="query-builder__functions-explorer__function"
176
- ref={dragConnector}
177
- >
176
+ <div className="query-builder__functions-explorer__function" ref={ref}>
178
177
  <div className="query-builder__functions-explorer__function__content">
179
178
  <div className="query-builder__functions-explorer__function__icon">
180
179
  <div className="query-builder__functions-explorer__function-icon">
@@ -250,6 +249,8 @@ const QueryBuilderFunctionsExplorerTreeNodeContainer = observer(
250
249
  }),
251
250
  [node],
252
251
  );
252
+ const ref = useRef<HTMLDivElement>(null);
253
+ dragConnector(ref);
253
254
  useDragPreviewLayer(dragPreviewConnector);
254
255
 
255
256
  return (
@@ -257,7 +258,7 @@ const QueryBuilderFunctionsExplorerTreeNodeContainer = observer(
257
258
  <div
258
259
  className="tree-view__node__container query-builder__functions-explorer__tree__node__container"
259
260
  onClick={selectNode}
260
- ref={!isExpandable ? dragConnector : undefined}
261
+ ref={!isExpandable ? ref : undefined}
261
262
  style={{
262
263
  paddingLeft: `${(level - 1) * (stepPaddingInRem ?? 1) + 0.5}rem`,
263
264
  display: 'flex',
@@ -16,7 +16,7 @@
16
16
 
17
17
  import { observer } from 'mobx-react-lite';
18
18
  import type { QueryBuilderState } from '../../stores/QueryBuilderState.js';
19
- import { useCallback } from 'react';
19
+ import { useCallback, useRef } from 'react';
20
20
  import {
21
21
  type ValueSpecification,
22
22
  GenericType,
@@ -81,6 +81,9 @@ export const MilestoningParameterEditor = observer(
81
81
  }),
82
82
  [handleDrop],
83
83
  );
84
+ const ref = useRef<HTMLDivElement>(null);
85
+ dropConnector(ref);
86
+
84
87
  const resetMilestoningParameter = (): void => {
85
88
  const param = observe_PrimitiveInstanceValue(
86
89
  new PrimitiveInstanceValue(
@@ -100,7 +103,7 @@ export const MilestoningParameterEditor = observer(
100
103
 
101
104
  return (
102
105
  <div
103
- ref={dropConnector}
106
+ ref={ref}
104
107
  className="query-builder__milestoning-panel__variable-editor"
105
108
  >
106
109
  <div className="query-builder__milestoning-panel__variable-editor__variable">
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { useState } from 'react';
17
+ import { useRef, useState } from 'react';
18
18
  import {
19
19
  clsx,
20
20
  CheckSquareIcon,
@@ -265,7 +265,8 @@ const QueryBuilderTreeNodeViewer = observer(
265
265
  }),
266
266
  [node],
267
267
  );
268
-
268
+ const ref = useRef<HTMLDivElement>(null);
269
+ dragConnector(ref);
269
270
  useDragPreviewLayer(dragPreviewConnector);
270
271
 
271
272
  const getChildrenNodes = (): QueryBuilderExplorerTreeNodeData[] => {
@@ -355,7 +356,7 @@ const QueryBuilderTreeNodeViewer = observer(
355
356
  <>
356
357
  <div
357
358
  className="tree-view__node__container query-builder-property-search-panel__node__container"
358
- ref={dragConnector}
359
+ ref={ref}
359
360
  style={{
360
361
  paddingLeft: `${(level - 1) * stepPaddingInRem + 0.5}rem`,
361
362
  display: 'flex',
@@ -29,6 +29,7 @@ import { type QueryBuilderTDSPanelDropTarget } from './QueryBuilderTDSPanel.js';
29
29
  import { QueryBuilderAggregateOperator_Wavg } from '../../stores/fetch-structure/tds/aggregation/operators/QueryBuilderAggregateOperator_Wavg.js';
30
30
  import type { QueryBuilderTDSState } from '../../stores/fetch-structure/tds/QueryBuilderTDSState.js';
31
31
  import { QUERY_BUILDER_TEST_ID } from '../../__lib__/QueryBuilderTesting.js';
32
+ import { useRef } from 'react';
32
33
 
33
34
  export const WavgParamDNDZone = (props: {
34
35
  column: QueryBuilderAggregateOperator_Wavg;
@@ -55,7 +56,7 @@ export const WavgParamDNDZone = (props: {
55
56
  }
56
57
  };
57
58
 
58
- const [{ isDragOver }, dropWavgParam] = useDrop<
59
+ const [{ isDragOver }, dropConnector] = useDrop<
59
60
  QueryBuilderTDSPanelDropTarget,
60
61
  void,
61
62
  { isDragOver: boolean }
@@ -71,7 +72,8 @@ export const WavgParamDNDZone = (props: {
71
72
  }),
72
73
  [handleDrop],
73
74
  );
74
-
75
+ const ref = useRef<HTMLDivElement>(null);
76
+ dropConnector(ref);
75
77
  const { isDroppable } = useDragLayer((monitor) => ({
76
78
  isDroppable:
77
79
  monitor.isDragging() &&
@@ -81,7 +83,6 @@ export const WavgParamDNDZone = (props: {
81
83
  }));
82
84
 
83
85
  const weightIsSet = () => column.weight !== undefined;
84
-
85
86
  const getWeightName = (): string => {
86
87
  if (column instanceof QueryBuilderAggregateOperator_Wavg) {
87
88
  return column.weight?.func.value.name ?? '';
@@ -92,8 +93,8 @@ export const WavgParamDNDZone = (props: {
92
93
 
93
94
  return (
94
95
  <div
96
+ ref={ref}
95
97
  data-testid={QUERY_BUILDER_TEST_ID.QUERY_BUILDER_WAVG_DROPZONE}
96
- ref={dropWavgParam}
97
98
  >
98
99
  <div>
99
100
  <PanelEntryDropZonePlaceholder
@@ -772,7 +772,7 @@ const QueryBuilderGraphFetchTreePanel = observer(
772
772
  },
773
773
  [graphFetchTreeState, serializationState],
774
774
  );
775
- const [{ isDragOver }, dropTargetConnector] = useDrop<
775
+ const [{ isDragOver }, dropConnector] = useDrop<
776
776
  QueryBuilderExplorerTreeDragSource,
777
777
  void,
778
778
  { isDragOver: boolean }
@@ -813,7 +813,7 @@ const QueryBuilderGraphFetchTreePanel = observer(
813
813
  >
814
814
  <PanelDropZone
815
815
  isDragOver={isDragOver}
816
- dropTargetConnector={dropTargetConnector}
816
+ dropTargetConnector={dropConnector}
817
817
  contentClassName="query-builder-graph-fetch-panel"
818
818
  >
819
819
  {(!treeData || isGraphFetchTreeDataEmpty(treeData)) && (
@@ -369,6 +369,9 @@ const QueryBuilderPostFilterConditionEditor = observer(
369
369
  }),
370
370
  [handleDrop],
371
371
  );
372
+ const ref = useRef<HTMLDivElement>(null);
373
+ dropConnector(ref);
374
+
372
375
  const { isFilterValueDroppable } = useDragLayer((monitor) => ({
373
376
  isFilterValueDroppable:
374
377
  monitor.isDragging() &&
@@ -424,7 +427,7 @@ const QueryBuilderPostFilterConditionEditor = observer(
424
427
  ) {
425
428
  return (
426
429
  <div
427
- ref={dropConnector}
430
+ ref={ref}
428
431
  className="query-builder-post-filter-tree__condition-node__value"
429
432
  >
430
433
  <PanelEntryDropZonePlaceholder
@@ -458,7 +461,7 @@ const QueryBuilderPostFilterConditionEditor = observer(
458
461
  ) {
459
462
  return (
460
463
  <div
461
- ref={dropConnector}
464
+ ref={ref}
462
465
  className="query-builder-post-filter-tree__condition-node__value"
463
466
  >
464
467
  <PanelEntryDropZonePlaceholder
@@ -565,7 +568,7 @@ const QueryBuilderPostFilterTreeNodeContainer = observer(
565
568
  ) => {
566
569
  const { node, onNodeSelect, innerProps } = props;
567
570
  const { tdsState } = innerProps;
568
- const dragRef = useRef<HTMLDivElement>(null);
571
+ const ref = useRef<HTMLDivElement>(null);
569
572
  const [isSelectedFromContextMenu, setIsSelectedFromContextMenu] =
570
573
  useState(false);
571
574
  const applicationStore = useApplicationStore();
@@ -702,7 +705,7 @@ const QueryBuilderPostFilterTreeNodeContainer = observer(
702
705
  }),
703
706
  [node, postFilterState],
704
707
  );
705
- dragConnector(dropConnector(dragRef));
708
+ dragConnector(dropConnector(ref));
706
709
  useDragPreviewLayer(dragPreviewConnector);
707
710
 
708
711
  const { isDroppable } = useDragLayer((monitor) => ({
@@ -757,7 +760,7 @@ const QueryBuilderPostFilterTreeNodeContainer = observer(
757
760
  QUERY_BUILDER_TEST_ID.QUERY_BUILDER_POST_FILTER_TREE_NODE_CONTENT
758
761
  }
759
762
  className="query-builder-post-filter-tree__node__content"
760
- ref={dragRef}
763
+ ref={ref}
761
764
  onClick={
762
765
  node instanceof QueryBuilderPostFilterTreeConditionNodeData ||
763
766
  node instanceof QueryBuilderPostFilterTreeBlankConditionNodeData
@@ -1031,7 +1034,7 @@ const QueryBuilderPostFilterPanelContent = observer(
1031
1034
  },
1032
1035
  [applicationStore, postFilterState, tdsState.aggregationState.columns],
1033
1036
  );
1034
- const [{ isDragOver }, dropTargetConnector] = useDrop<
1037
+ const [{ isDragOver }, dropConnector] = useDrop<
1035
1038
  QueryBuilderProjectionColumnDragSource,
1036
1039
  void,
1037
1040
  { isDragOver: boolean }
@@ -1050,8 +1053,8 @@ const QueryBuilderPostFilterPanelContent = observer(
1050
1053
  [applicationStore, handleDrop],
1051
1054
  );
1052
1055
 
1053
- const addPostFilterRef = useRef<HTMLDivElement>(null);
1054
- dropTargetConnector(addPostFilterRef);
1056
+ const ref = useRef<HTMLDivElement>(null);
1057
+ dropConnector(ref);
1055
1058
 
1056
1059
  return (
1057
1060
  <>
@@ -1145,7 +1148,7 @@ const QueryBuilderPostFilterPanelContent = observer(
1145
1148
  <PanelDropZone
1146
1149
  isDragOver={isDragOver && postFilterState.isEmpty}
1147
1150
  isDroppable={isDroppable && postFilterState.isEmpty}
1148
- dropTargetConnector={dropTargetConnector}
1151
+ dropTargetConnector={dropConnector}
1149
1152
  >
1150
1153
  {
1151
1154
  <PanelLoadingIndicator
@@ -1171,7 +1174,7 @@ const QueryBuilderPostFilterPanelContent = observer(
1171
1174
  )}
1172
1175
  {isDroppable && !postFilterState.isEmpty && (
1173
1176
  <div
1174
- ref={addPostFilterRef}
1177
+ ref={ref}
1175
1178
  className="query-builder-post-filter-tree__free-drop-zone__container"
1176
1179
  >
1177
1180
  <PanelEntryDropZonePlaceholder
@@ -360,7 +360,7 @@ export const QueryResultModifierModal = observer(
360
360
  setWatermarkValue(watermarkState.getDefaultValue());
361
361
  }
362
362
  };
363
- const [{ isParameterValueDragOver }, dropTargetConnector] = useDrop<
363
+ const [{ isParameterValueDragOver }, dropConnector] = useDrop<
364
364
  QueryBuilderVariableDragSource,
365
365
  void,
366
366
  { isParameterValueDragOver: boolean }
@@ -1047,7 +1047,7 @@ export const QueryResultModifierModal = observer(
1047
1047
  >
1048
1048
  <PanelDropZone
1049
1049
  isDragOver={isParameterValueDragOver}
1050
- dropTargetConnector={dropTargetConnector}
1050
+ dropTargetConnector={dropConnector}
1051
1051
  >
1052
1052
  <BasicValueSpecificationEditor
1053
1053
  valueSpecification={watermarkValue}
@@ -275,10 +275,12 @@ const QueryBuilderDerivationProjectionColumnEditor = observer(
275
275
  }),
276
276
  [handleDrop],
277
277
  );
278
+ const ref = useRef<HTMLDivElement>(null);
279
+ dropConnector(ref);
278
280
 
279
281
  return (
280
282
  <div
281
- ref={dropConnector}
283
+ ref={ref}
282
284
  className={clsx(
283
285
  'query-builder__lambda-editor__container query-builder__projection__column__derivation',
284
286
  { backdrop__element: hasParserError },
@@ -391,9 +393,9 @@ const QueryBuilderProjectionColumnEditor = observer(
391
393
  currentRearrangeDropGapIndex,
392
394
  setCurrentRearrangeDropGapIndex,
393
395
  } = props;
394
- const dragHandleRef = useRef<HTMLDivElement>(null);
395
396
  const applicationStore = useApplicationStore();
396
397
  const ref = useRef<HTMLDivElement>(null);
398
+ const dragHandleRef = useRef<HTMLDivElement>(null);
397
399
  const [isSelectedFromContextMenu, setIsSelectedFromContextMenu] =
398
400
  useState(false);
399
401
  const onContextMenuOpen = (): void => setIsSelectedFromContextMenu(true);
@@ -661,7 +663,6 @@ const QueryBuilderProjectionColumnEditor = observer(
661
663
  }),
662
664
  [projectionColumnState],
663
665
  );
664
-
665
666
  dragConnector(dragHandleRef);
666
667
  dropConnector(ref);
667
668
 
@@ -703,7 +704,7 @@ const QueryBuilderProjectionColumnEditor = observer(
703
704
  tdsState.queryBuilderState.explorerState,
704
705
  ],
705
706
  );
706
- const [{ isDragOver }, dropTargetConnector] = useDrop<
707
+ const [{ isDragOver }, panelDropConnector] = useDrop<
707
708
  QueryBuilderExplorerTreeDragSource,
708
709
  void,
709
710
  { isDragOver: boolean }
@@ -721,6 +722,9 @@ const QueryBuilderProjectionColumnEditor = observer(
721
722
  }),
722
723
  [handleDrop],
723
724
  );
725
+ const panelRef = useRef<HTMLDivElement>(null);
726
+ panelDropConnector(panelRef);
727
+
724
728
  const percentileButtonRef = useRef<HTMLButtonElement>(null);
725
729
  const percentileInputRef = useRef<HTMLInputElement>(null);
726
730
  const [isPercentileOpen, setIsPercentileOpen] = useState(false);
@@ -1192,7 +1196,7 @@ const QueryBuilderProjectionColumnEditor = observer(
1192
1196
  </div>
1193
1197
  <div
1194
1198
  className="query-builder__projection__calendar__date__column"
1195
- ref={dropTargetConnector}
1199
+ ref={panelRef}
1196
1200
  >
1197
1201
  <PanelEntryDropZonePlaceholder
1198
1202
  isDragOver={isDragOver}
@@ -1335,7 +1339,7 @@ export const QueryBuilderTDSPanel = observer(
1335
1339
  [tdsState],
1336
1340
  );
1337
1341
 
1338
- const [{ isDragOver }, dropTargetConnector] = useDrop<
1342
+ const [{ isDragOver }, panelDropConnector] = useDrop<
1339
1343
  QueryBuilderTDSPanelDropTarget,
1340
1344
  void,
1341
1345
  { isDragOver: boolean }
@@ -1353,8 +1357,10 @@ export const QueryBuilderTDSPanel = observer(
1353
1357
  }),
1354
1358
  [handleDrop],
1355
1359
  );
1360
+ const panelRef = useRef<HTMLInputElement>(null);
1361
+ panelDropConnector(panelRef);
1356
1362
 
1357
- const [{ isRearrangeActive }, rearrangeColumnDropConnector] = useDrop<
1363
+ const [{ isRearrangeActive }, dropConnector] = useDrop<
1358
1364
  QueryBuilderProjectionColumnDragSource,
1359
1365
  void,
1360
1366
  { isRearrangeActive: boolean }
@@ -1367,6 +1373,8 @@ export const QueryBuilderTDSPanel = observer(
1367
1373
  }),
1368
1374
  [],
1369
1375
  );
1376
+ const ref = useRef<HTMLDivElement>(null);
1377
+ dropConnector(ref);
1370
1378
 
1371
1379
  const { isDroppable } = useDragLayer((monitor) => ({
1372
1380
  isDroppable:
@@ -1382,9 +1390,6 @@ export const QueryBuilderTDSPanel = observer(
1382
1390
  );
1383
1391
  }, [applicationStore, tdsState]);
1384
1392
 
1385
- const addProjectionRef = useRef<HTMLInputElement>(null);
1386
- dropTargetConnector(addProjectionRef);
1387
-
1388
1393
  return (
1389
1394
  <PanelContent>
1390
1395
  <div className="query-builder__projection__toolbar">
@@ -1634,7 +1639,7 @@ export const QueryBuilderTDSPanel = observer(
1634
1639
  <PanelDropZone
1635
1640
  isDragOver={isDragOver && isEmpty}
1636
1641
  isDroppable={isDroppable && isEmpty}
1637
- dropTargetConnector={dropTargetConnector}
1642
+ dropTargetConnector={panelDropConnector}
1638
1643
  >
1639
1644
  {!projectionColumns.length && (
1640
1645
  <BlankPanelPlaceholder
@@ -1647,7 +1652,7 @@ export const QueryBuilderTDSPanel = observer(
1647
1652
  data-testid={QUERY_BUILDER_TEST_ID.QUERY_BUILDER_TDS}
1648
1653
  className="query-builder__projection__columns"
1649
1654
  >
1650
- <div ref={rearrangeColumnDropConnector}>
1655
+ <div ref={ref}>
1651
1656
  <DragPreviewLayer
1652
1657
  labelGetter={(
1653
1658
  item: QueryBuilderProjectionColumnDragSource,
@@ -1683,7 +1688,7 @@ export const QueryBuilderTDSPanel = observer(
1683
1688
  )}
1684
1689
  {isDroppable && !isEmpty && (
1685
1690
  <div
1686
- ref={addProjectionRef}
1691
+ ref={panelRef}
1687
1692
  className="query-builder__projection__free-drop-zone__container"
1688
1693
  >
1689
1694
  <PanelEntryDropZonePlaceholder
@@ -691,7 +691,7 @@ const TDSColumnReferenceEditor = observer(
691
691
  },
692
692
  [handleChange],
693
693
  );
694
- const [{ isDragOver }, dropOpConnector] = useDrop<
694
+ const [{ isDragOver }, dropConnector] = useDrop<
695
695
  QueryBuilderWindowColumnDragSource,
696
696
  void,
697
697
  { isDragOver: boolean }
@@ -712,6 +712,8 @@ const TDSColumnReferenceEditor = observer(
712
712
  }),
713
713
  [handleDrop],
714
714
  );
715
+ const ref = useRef<HTMLDivElement>(null);
716
+ dropConnector(ref);
715
717
 
716
718
  return (
717
719
  <>
@@ -719,10 +721,7 @@ const TDSColumnReferenceEditor = observer(
719
721
  onClick={openOpAnchor}
720
722
  className="query-builder__olap__tds__column"
721
723
  >
722
- <div
723
- ref={dropOpConnector}
724
- className="query-builder__olap__tds__column-badge"
725
- >
724
+ <div ref={ref} className="query-builder__olap__tds__column-badge">
726
725
  <PanelEntryDropZonePlaceholder
727
726
  isDragOver={isDragOver}
728
727
  label="Change Column"
@@ -945,7 +944,7 @@ const QueryBuilderWindowColumnEditor = observer(
945
944
  },
946
945
  [windowColumnState],
947
946
  );
948
- const [{ isDragOver }, dropOpConnector] = useDrop<
947
+ const [{ isDragOver }, operationDropConnector] = useDrop<
949
948
  QueryBuilderWindowColumnDragSource,
950
949
  void,
951
950
  { isDragOver: boolean }
@@ -966,6 +965,8 @@ const QueryBuilderWindowColumnEditor = observer(
966
965
  }),
967
966
  [handleWindowDrop],
968
967
  );
968
+ const opRef = useRef<HTMLButtonElement>(null);
969
+ operationDropConnector(opRef);
969
970
 
970
971
  return (
971
972
  <PanelDnDEntry
@@ -1052,7 +1053,7 @@ const QueryBuilderWindowColumnEditor = observer(
1052
1053
  </div>
1053
1054
  <div className="query-builder__olap__column__window">
1054
1055
  <button
1055
- ref={dropOpConnector}
1056
+ ref={opRef}
1056
1057
  title="Click to edit or drag and drop columns"
1057
1058
  onClick={openWindowPopover}
1058
1059
  className="query-builder__olap__column__window__content"
@@ -1266,7 +1267,7 @@ export const QueryBuilderTDSWindowPanel = observer(
1266
1267
  [applicationStore, tdsWindowState],
1267
1268
  );
1268
1269
 
1269
- const [{ isDragOver }, dropTargetConnector] = useDrop<
1270
+ const [{ isDragOver }, dropConnector] = useDrop<
1270
1271
  QueryBuilderWindowDropTarget,
1271
1272
  void,
1272
1273
  { isDragOver: boolean }
@@ -1296,8 +1297,8 @@ export const QueryBuilderTDSWindowPanel = observer(
1296
1297
  ),
1297
1298
  }));
1298
1299
 
1299
- const addWindowColumnRef = useRef<HTMLDivElement>(null);
1300
- dropTargetConnector(addWindowColumnRef);
1300
+ const ref = useRef<HTMLDivElement>(null);
1301
+ dropConnector(ref);
1301
1302
 
1302
1303
  return (
1303
1304
  <Panel>
@@ -1328,7 +1329,7 @@ export const QueryBuilderTDSWindowPanel = observer(
1328
1329
  <PanelDropZone
1329
1330
  isDragOver={isDragOver && tdsWindowState.isEmpty}
1330
1331
  isDroppable={isDroppable && tdsWindowState.isEmpty}
1331
- dropTargetConnector={dropTargetConnector}
1332
+ dropTargetConnector={dropConnector}
1332
1333
  >
1333
1334
  {tdsWindowState.isEmpty && (
1334
1335
  <BlankPanelPlaceholder
@@ -1363,7 +1364,7 @@ export const QueryBuilderTDSWindowPanel = observer(
1363
1364
  )}
1364
1365
  {isDroppable && !tdsWindowState.isEmpty && (
1365
1366
  <div
1366
- ref={addWindowColumnRef}
1367
+ ref={ref}
1367
1368
  className="query-builder__olap__free-drop-zone__container"
1368
1369
  >
1369
1370
  <PanelEntryDropZonePlaceholder