@finos/legend-query-builder 4.1.2 → 4.1.3

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 (98) hide show
  1. package/lib/components/QueryBuilderPropertyExpressionEditor.d.ts.map +1 -1
  2. package/lib/components/QueryBuilderPropertyExpressionEditor.js +1 -1
  3. package/lib/components/QueryBuilderPropertyExpressionEditor.js.map +1 -1
  4. package/lib/components/QueryBuilderResultPanel.d.ts.map +1 -1
  5. package/lib/components/QueryBuilderResultPanel.js +91 -24
  6. package/lib/components/QueryBuilderResultPanel.js.map +1 -1
  7. package/lib/components/execution-plan/AllocationExecutionNodeViewer.d.ts +23 -0
  8. package/lib/components/execution-plan/AllocationExecutionNodeViewer.d.ts.map +1 -0
  9. package/lib/components/execution-plan/AllocationExecutionNodeViewer.js +32 -0
  10. package/lib/components/execution-plan/AllocationExecutionNodeViewer.js.map +1 -0
  11. package/lib/components/execution-plan/ConstantExecutionNodeViewer.d.ts +23 -0
  12. package/lib/components/execution-plan/ConstantExecutionNodeViewer.d.ts.map +1 -0
  13. package/lib/components/execution-plan/ConstantExecutionNodeViewer.js +35 -0
  14. package/lib/components/execution-plan/ConstantExecutionNodeViewer.js.map +1 -0
  15. package/lib/components/execution-plan/DataTypeResultTypeViewer.d.ts +21 -0
  16. package/lib/components/execution-plan/DataTypeResultTypeViewer.d.ts.map +1 -0
  17. package/lib/components/execution-plan/DataTypeResultTypeViewer.js +31 -0
  18. package/lib/components/execution-plan/DataTypeResultTypeViewer.js.map +1 -0
  19. package/lib/components/execution-plan/ExecutionPlanViewer.d.ts +10 -4
  20. package/lib/components/execution-plan/ExecutionPlanViewer.d.ts.map +1 -1
  21. package/lib/components/execution-plan/ExecutionPlanViewer.js +74 -62
  22. package/lib/components/execution-plan/ExecutionPlanViewer.js.map +1 -1
  23. package/lib/components/execution-plan/FunctionParametersValidationNodeViewer.d.ts +25 -0
  24. package/lib/components/execution-plan/FunctionParametersValidationNodeViewer.d.ts.map +1 -0
  25. package/lib/components/execution-plan/FunctionParametersValidationNodeViewer.js +47 -0
  26. package/lib/components/execution-plan/FunctionParametersValidationNodeViewer.js.map +1 -0
  27. package/lib/components/execution-plan/RelationalTDSInstantiationExecutionNodeViewer.d.ts +23 -0
  28. package/lib/components/execution-plan/RelationalTDSInstantiationExecutionNodeViewer.d.ts.map +1 -0
  29. package/lib/components/execution-plan/RelationalTDSInstantiationExecutionNodeViewer.js +31 -0
  30. package/lib/components/execution-plan/RelationalTDSInstantiationExecutionNodeViewer.js.map +1 -0
  31. package/lib/components/execution-plan/ResultTypeViewer.d.ts +21 -0
  32. package/lib/components/execution-plan/ResultTypeViewer.d.ts.map +1 -0
  33. package/lib/components/execution-plan/ResultTypeViewer.js +33 -0
  34. package/lib/components/execution-plan/ResultTypeViewer.js.map +1 -0
  35. package/lib/components/execution-plan/SQLExecutionNodeViewer.d.ts +9 -1
  36. package/lib/components/execution-plan/SQLExecutionNodeViewer.d.ts.map +1 -1
  37. package/lib/components/execution-plan/SQLExecutionNodeViewer.js +12 -6
  38. package/lib/components/execution-plan/SQLExecutionNodeViewer.js.map +1 -1
  39. package/lib/components/execution-plan/SequenceExecutionNodeViewer.d.ts +23 -0
  40. package/lib/components/execution-plan/SequenceExecutionNodeViewer.d.ts.map +1 -0
  41. package/lib/components/execution-plan/SequenceExecutionNodeViewer.js +38 -0
  42. package/lib/components/execution-plan/SequenceExecutionNodeViewer.js.map +1 -0
  43. package/lib/components/execution-plan/TDSResultTypeViewer.d.ts +21 -0
  44. package/lib/components/execution-plan/TDSResultTypeViewer.d.ts.map +1 -0
  45. package/lib/components/execution-plan/TDSResultTypeViewer.js +25 -0
  46. package/lib/components/execution-plan/TDSResultTypeViewer.js.map +1 -0
  47. package/lib/components/explorer/QueryBuilderMilestoningEditor.d.ts.map +1 -1
  48. package/lib/components/explorer/QueryBuilderMilestoningEditor.js +3 -3
  49. package/lib/components/explorer/QueryBuilderMilestoningEditor.js.map +1 -1
  50. package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.d.ts.map +1 -1
  51. package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js +24 -34
  52. package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js.map +1 -1
  53. package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts.map +1 -1
  54. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js +44 -11
  55. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js.map +1 -1
  56. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.d.ts.map +1 -1
  57. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js +4 -4
  58. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js.map +1 -1
  59. package/lib/components/filter/QueryBuilderFilterPanel.d.ts.map +1 -1
  60. package/lib/components/filter/QueryBuilderFilterPanel.js +20 -32
  61. package/lib/components/filter/QueryBuilderFilterPanel.js.map +1 -1
  62. package/lib/index.css +2 -2
  63. package/lib/index.css.map +1 -1
  64. package/lib/package.json +1 -1
  65. package/lib/stores/QueryBuilderResultState.d.ts +0 -3
  66. package/lib/stores/QueryBuilderResultState.d.ts.map +1 -1
  67. package/lib/stores/QueryBuilderResultState.js +2 -25
  68. package/lib/stores/QueryBuilderResultState.js.map +1 -1
  69. package/lib/stores/execution-plan/ExecutionPlanState.d.ts +14 -1
  70. package/lib/stores/execution-plan/ExecutionPlanState.d.ts.map +1 -1
  71. package/lib/stores/execution-plan/ExecutionPlanState.js +86 -3
  72. package/lib/stores/execution-plan/ExecutionPlanState.js.map +1 -1
  73. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts +3 -0
  74. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts.map +1 -1
  75. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js +11 -0
  76. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js.map +1 -1
  77. package/package.json +5 -5
  78. package/src/components/QueryBuilderPropertyExpressionEditor.tsx +1 -2
  79. package/src/components/QueryBuilderResultPanel.tsx +146 -30
  80. package/src/components/execution-plan/AllocationExecutionNodeViewer.tsx +77 -0
  81. package/src/components/execution-plan/ConstantExecutionNodeViewer.tsx +82 -0
  82. package/src/components/execution-plan/DataTypeResultTypeViewer.tsx +52 -0
  83. package/src/components/execution-plan/ExecutionPlanViewer.tsx +205 -195
  84. package/src/components/execution-plan/FunctionParametersValidationNodeViewer.tsx +118 -0
  85. package/src/components/execution-plan/RelationalTDSInstantiationExecutionNodeViewer.tsx +68 -0
  86. package/src/components/execution-plan/ResultTypeViewer.tsx +37 -0
  87. package/src/components/execution-plan/SQLExecutionNodeViewer.tsx +50 -19
  88. package/src/components/execution-plan/SequenceExecutionNodeViewer.tsx +95 -0
  89. package/src/components/execution-plan/TDSResultTypeViewer.tsx +59 -0
  90. package/src/components/explorer/QueryBuilderMilestoningEditor.tsx +5 -8
  91. package/src/components/fetch-structure/QueryBuilderPostFilterPanel.tsx +32 -61
  92. package/src/components/fetch-structure/QueryBuilderTDSPanel.tsx +77 -14
  93. package/src/components/fetch-structure/QueryBuilderTDSWindowPanel.tsx +6 -8
  94. package/src/components/filter/QueryBuilderFilterPanel.tsx +45 -73
  95. package/src/stores/QueryBuilderResultState.ts +1 -42
  96. package/src/stores/execution-plan/ExecutionPlanState.ts +142 -4
  97. package/src/stores/fetch-structure/tds/QueryBuilderTDSState.ts +16 -0
  98. package/tsconfig.json +8 -0
@@ -0,0 +1,37 @@
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 { observer } from 'mobx-react-lite';
18
+ import {
19
+ type ResultType,
20
+ TDSResultType,
21
+ DataTypeResultType,
22
+ } from '@finos/legend-graph';
23
+ import { DataTypeResultTypeViewer } from './DataTypeResultTypeViewer.js';
24
+ import { TDSResultTypeViewer } from './TDSResultTypeViewer.js';
25
+
26
+ export const ResultTypeViewer: React.FC<{
27
+ resultType: ResultType;
28
+ }> = observer((props) => {
29
+ const { resultType } = props;
30
+ if (resultType instanceof DataTypeResultType) {
31
+ return <DataTypeResultTypeViewer resultType={resultType} />;
32
+ } else if (resultType instanceof TDSResultType) {
33
+ return <TDSResultTypeViewer resultType={resultType} />;
34
+ } else {
35
+ return <></>;
36
+ }
37
+ });
@@ -19,7 +19,11 @@ import {
19
19
  type ExecutionPlanState,
20
20
  EXECUTION_PLAN_VIEW_MODE,
21
21
  } from '../../stores/execution-plan/ExecutionPlanState.js';
22
- import { type SQLResultColumn, stringifyDataType } from '@finos/legend-graph';
22
+ import {
23
+ type SQLResultColumn,
24
+ stringifyDataType,
25
+ type ResultType,
26
+ } from '@finos/legend-graph';
23
27
  import {
24
28
  PanelListItem,
25
29
  CopyIcon,
@@ -28,6 +32,7 @@ import {
28
32
  PanelContent,
29
33
  } from '@finos/legend-art';
30
34
  import { tryToFormatSql } from '../QueryBuilderResultPanel.js';
35
+ import { ResultTypeViewer } from './ResultTypeViewer.js';
31
36
  import {
32
37
  CodeEditor,
33
38
  CODE_EDITOR_LANGUAGE,
@@ -40,13 +45,14 @@ import {
40
45
  * @modularize
41
46
  * See https://github.com/finos/legend-studio/issues/65
42
47
  */
43
- export const SQLExecutionNodeViewer: React.FC<{
48
+
49
+ export const SQLExecutionNodeViewerHelper: React.FC<{
44
50
  query: string;
45
51
  resultColumns: SQLResultColumn[];
52
+ resultType: ResultType;
46
53
  executionPlanState: ExecutionPlanState;
47
54
  }> = observer((props) => {
48
- const { query, resultColumns, executionPlanState } = props;
49
-
55
+ const { query, resultColumns, resultType, executionPlanState } = props;
50
56
  const applicationStore = executionPlanState.applicationStore;
51
57
  const copyExpression = (value: string): void => {
52
58
  applicationStore.clipboardService
@@ -60,12 +66,9 @@ export const SQLExecutionNodeViewer: React.FC<{
60
66
  )
61
67
  .catch(applicationStore.alertUnhandledError);
62
68
  };
69
+
63
70
  return (
64
- <PanelContent
65
- darkMode={
66
- !applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
67
- }
68
- >
71
+ <>
69
72
  <div className="query-builder__sql__container">
70
73
  <PanelDivider />
71
74
  <div key={query}>
@@ -125,17 +128,45 @@ export const SQLExecutionNodeViewer: React.FC<{
125
128
  </table>
126
129
  </div>
127
130
  </div>
128
- <PanelDivider />
131
+ <ResultTypeViewer resultType={resultType} />
132
+ </>
133
+ );
134
+ });
129
135
 
130
- <div className="query-builder__sql__container">
131
- <Button
132
- className="btn--dark execution-node-viewer__unsupported-view__to-text-mode__btn"
133
- onClick={(): void =>
134
- executionPlanState.setViewMode(EXECUTION_PLAN_VIEW_MODE.JSON)
135
- }
136
- text="View JSON"
137
- />
138
- </div>
136
+ export const SQLExecutionNodeViewer: React.FC<{
137
+ query: string;
138
+ resultColumns: SQLResultColumn[];
139
+ resultType: ResultType;
140
+ executionPlanState: ExecutionPlanState;
141
+ viewJson: boolean;
142
+ }> = observer((props) => {
143
+ const { query, resultColumns, resultType, executionPlanState, viewJson } =
144
+ props;
145
+ const applicationStore = executionPlanState.applicationStore;
146
+
147
+ return (
148
+ <PanelContent
149
+ darkMode={
150
+ !applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
151
+ }
152
+ >
153
+ <SQLExecutionNodeViewerHelper
154
+ query={query}
155
+ resultColumns={resultColumns}
156
+ resultType={resultType}
157
+ executionPlanState={executionPlanState}
158
+ />
159
+ {viewJson && (
160
+ <div className="query-builder__sql__container">
161
+ <Button
162
+ className="btn--dark execution-node-viewer__unsupported-view__to-text-mode__btn"
163
+ onClick={(): void =>
164
+ executionPlanState.setViewMode(EXECUTION_PLAN_VIEW_MODE.JSON)
165
+ }
166
+ text="View JSON"
167
+ />
168
+ </div>
169
+ )}
139
170
  <PanelDivider />
140
171
  </PanelContent>
141
172
  );
@@ -0,0 +1,95 @@
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 { observer } from 'mobx-react-lite';
18
+ import { generateExecutionNodeLabel } from './ExecutionPlanViewer.js';
19
+ import {
20
+ type ExecutionPlanState,
21
+ EXECUTION_PLAN_VIEW_MODE,
22
+ ExecutionPlanViewTreeNodeData,
23
+ ExecutionNodeTreeNodeData,
24
+ } from '../../stores/execution-plan/ExecutionPlanState.js';
25
+
26
+ import {
27
+ PanelListItem,
28
+ PanelDivider,
29
+ Button,
30
+ PanelContent,
31
+ } from '@finos/legend-art';
32
+ import type { ExecutionNode, SequenceExecutionNode } from '@finos/legend-graph';
33
+ import { ResultTypeViewer } from './ResultTypeViewer.js';
34
+
35
+ export const SequenceExecutionNodeViewer: React.FC<{
36
+ node: SequenceExecutionNode;
37
+ executionPlanState: ExecutionPlanState;
38
+ }> = observer((props) => {
39
+ const { node, executionPlanState } = props;
40
+ const resultType = node.resultType;
41
+ const applicationStore = executionPlanState.applicationStore;
42
+ const openExecutionNode = (child: ExecutionNode): void => {
43
+ const newNode = executionPlanState.treeData?.nodes.get(child._UUID);
44
+ if (newNode instanceof ExecutionPlanViewTreeNodeData) {
45
+ executionPlanState.transformMetadataToProtocolJson(newNode.executionPlan);
46
+ } else if (newNode instanceof ExecutionNodeTreeNodeData) {
47
+ executionPlanState.transformMetadataToProtocolJson(newNode.executionNode);
48
+ }
49
+ executionPlanState.setSelectedNode(newNode);
50
+ };
51
+
52
+ return (
53
+ <PanelContent
54
+ darkMode={
55
+ !applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
56
+ }
57
+ >
58
+ <div className="query-builder__sequence__container">
59
+ <div>
60
+ <PanelListItem className="query-builder__sequence__container__item__label">
61
+ Execution Nodes
62
+ </PanelListItem>
63
+ <PanelDivider />
64
+ {node.executionNodes.map((child, index) => (
65
+ <div
66
+ className="query-builder__sequence__container__item"
67
+ key={child._UUID}
68
+ >
69
+ <button
70
+ className="query-builder__sequence__container__item__btn"
71
+ onClick={() => openExecutionNode(child)}
72
+ tabIndex={-1}
73
+ title={`Go to ${generateExecutionNodeLabel(child)}`}
74
+ >
75
+ {`${index + 1}: ${generateExecutionNodeLabel(child)}`}
76
+ </button>
77
+ </div>
78
+ ))}
79
+ </div>
80
+ </div>
81
+ <PanelDivider />
82
+ <ResultTypeViewer resultType={resultType} />
83
+ <div className="query-builder__execution__container">
84
+ <Button
85
+ className="btn--dark execution-node-viewer__unsupported-view__to-text-mode__btn"
86
+ onClick={(): void =>
87
+ executionPlanState.setViewMode(EXECUTION_PLAN_VIEW_MODE.JSON)
88
+ }
89
+ text="View JSON"
90
+ />
91
+ </div>
92
+ <PanelDivider />
93
+ </PanelContent>
94
+ );
95
+ });
@@ -0,0 +1,59 @@
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 { observer } from 'mobx-react-lite';
18
+ import { PanelListItem, PanelDivider } from '@finos/legend-art';
19
+ import {
20
+ PackageableElementImplicitReference,
21
+ type TDSResultType,
22
+ } from '@finos/legend-graph';
23
+
24
+ export const TDSResultTypeViewer: React.FC<{
25
+ resultType: TDSResultType;
26
+ }> = observer((props) => {
27
+ const { resultType } = props;
28
+
29
+ return (
30
+ <div className="query-builder__result__container">
31
+ <PanelListItem className="query-builder__result__container__item__tds">
32
+ Result type: TDS
33
+ </PanelListItem>
34
+ <PanelDivider />
35
+ {
36
+ <table className="table query-builder__result__container__table">
37
+ <thead>
38
+ <tr>
39
+ <th className="table__cell--left">Label</th>
40
+ <th className="table__cell--left">Result DataType</th>
41
+ </tr>
42
+ </thead>
43
+ <tbody>
44
+ {resultType.tdsColumns.map((column) => (
45
+ <tr key={column.name}>
46
+ <td className="table__cell--left">{column.name}</td>
47
+ <td className="table__cell--left">
48
+ {column.type instanceof PackageableElementImplicitReference &&
49
+ (column.type.input ?? '')}
50
+ </td>
51
+ </tr>
52
+ ))}
53
+ </tbody>
54
+ </table>
55
+ }
56
+ <PanelDivider />
57
+ </div>
58
+ );
59
+ });
@@ -65,10 +65,10 @@ const MilestoningParameterEditor = observer(
65
65
  },
66
66
  [queryBuilderState, stereotype],
67
67
  );
68
- const [{ isMilestoningParameterValueDragOver }, dropConnector] = useDrop<
68
+ const [{ isDragOver }, dropConnector] = useDrop<
69
69
  QueryBuilderVariableDragSource,
70
70
  void,
71
- { isMilestoningParameterValueDragOver: boolean }
71
+ { isDragOver: boolean }
72
72
  >(
73
73
  () => ({
74
74
  accept: [QUERY_BUILDER_VARIABLE_DND_TYPE],
@@ -77,10 +77,8 @@ const MilestoningParameterEditor = observer(
77
77
  handleDrop(item);
78
78
  }
79
79
  },
80
- collect: (
81
- monitor,
82
- ): { isMilestoningParameterValueDragOver: boolean } => ({
83
- isMilestoningParameterValueDragOver: monitor.isOver({
80
+ collect: (monitor): { isDragOver: boolean } => ({
81
+ isDragOver: monitor.isOver({
84
82
  shallow: true,
85
83
  }),
86
84
  }),
@@ -121,9 +119,8 @@ const MilestoningParameterEditor = observer(
121
119
  return (
122
120
  <div ref={dropConnector} className="query-builder__variable-editor">
123
121
  <PanelEntryDropZonePlaceholder
124
- showPlaceholder={isMilestoningParameterValueDragOver}
122
+ isDragOver={isDragOver}
125
123
  label="Change Milestoning Parameter Value"
126
- className="query-builder__dnd__placeholder"
127
124
  >
128
125
  <BasicValueSpecificationEditor
129
126
  valueSpecification={milestoningParameter}
@@ -153,9 +153,9 @@ const QueryBuilderPostFilterGroupConditionEditor = observer(
153
153
  (props: {
154
154
  node: QueryBuilderPostFilterTreeGroupNodeData;
155
155
  isDragOver: boolean;
156
- showDroppableSuggestion: boolean;
156
+ isDroppable: boolean;
157
157
  }) => {
158
- const { node, isDragOver, showDroppableSuggestion } = props;
158
+ const { node, isDragOver, isDroppable: isDroppable } = props;
159
159
  const switchOperation: React.MouseEventHandler<HTMLDivElement> = (
160
160
  event,
161
161
  ): void => {
@@ -168,17 +168,10 @@ const QueryBuilderPostFilterGroupConditionEditor = observer(
168
168
  };
169
169
  return (
170
170
  <div className="query-builder-post-filter-tree__node__label__content dnd__entry__container">
171
- {showDroppableSuggestion && (
172
- <div
173
- className={clsx('dnd__entry--droppable__indicator ', {
174
- 'dnd__entry--droppable__indicator--dragover': isDragOver,
175
- })}
176
- ></div>
177
- )}
178
171
  <PanelEntryDropZonePlaceholder
179
- showPlaceholder={isDragOver}
172
+ isDragOver={isDragOver}
173
+ isDroppable={isDroppable}
180
174
  label="Add to Logical Group"
181
- className="query-builder__dnd__placeholder"
182
175
  >
183
176
  <div
184
177
  className={clsx('query-builder-post-filter-tree__group-node', {
@@ -243,9 +236,8 @@ export const QueryBuilderColumnBadge = observer(
243
236
  return (
244
237
  <div ref={dropConnector} className="query-builder-column-badge">
245
238
  <PanelEntryDropZonePlaceholder
246
- showPlaceholder={isDragOver}
239
+ isDragOver={isDragOver}
247
240
  label="Change Property"
248
- className="query-builder__dnd__placeholder"
249
241
  >
250
242
  <div className="query-builder-column-badge__content">
251
243
  {type && (
@@ -367,8 +359,8 @@ const QueryBuilderPostFilterConditionEditor = observer(
367
359
  cleanUpReloadValues,
368
360
  };
369
361
 
370
- const { showDroppableSuggestion } = useDragLayer((monitor) => ({
371
- showDroppableSuggestion:
362
+ const { isDroppable } = useDragLayer((monitor) => ({
363
+ isDroppable:
372
364
  monitor.isDragging() &&
373
365
  (monitor.getItemType() === QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE ||
374
366
  monitor.getItemType() === QUERY_BUILDER_WINDOW_COLUMN_DND_TYPE),
@@ -376,20 +368,10 @@ const QueryBuilderPostFilterConditionEditor = observer(
376
368
 
377
369
  return (
378
370
  <div className="query-builder-post-filter-tree__node__label__content dnd__entry__container">
379
- {showDroppableSuggestion && (
380
- <div
381
- className={clsx(
382
- 'dnd__entry--droppable__indicator query-builder-post-filter-tree__droppable--full',
383
- {
384
- 'dnd__entry--droppable__indicator--dragover': isDragOver,
385
- },
386
- )}
387
- ></div>
388
- )}
389
371
  <PanelEntryDropZonePlaceholder
390
- showPlaceholder={isDragOver}
372
+ isDragOver={isDragOver}
373
+ isDroppable={isDroppable}
391
374
  label="Add New Logical Group"
392
- className="query-builder__dnd__placeholder"
393
375
  >
394
376
  <div className="query-builder-post-filter-tree__condition-node">
395
377
  <div className="query-builder-post-filter-tree__condition-node__property">
@@ -433,9 +415,8 @@ const QueryBuilderPostFilterConditionEditor = observer(
433
415
  className="query-builder-post-filter-tree__condition-node__value"
434
416
  >
435
417
  <PanelEntryDropZonePlaceholder
436
- showPlaceholder={isFilterValueDragOver}
418
+ isDragOver={isFilterValueDragOver}
437
419
  label="Change Filter Value"
438
- className="query-builder__dnd__placeholder"
439
420
  >
440
421
  <BasicValueSpecificationEditor
441
422
  valueSpecification={node.condition.value}
@@ -467,22 +448,17 @@ const QueryBuilderPostFilterBlankConditionEditor = observer(
467
448
  (props: {
468
449
  node: QueryBuilderPostFilterTreeBlankConditionNodeData;
469
450
  isDragOver: boolean;
470
- showDroppableSuggestion: boolean;
451
+ isDroppable: boolean;
471
452
  }) => {
472
- const { isDragOver, showDroppableSuggestion } = props;
453
+ const { isDragOver, isDroppable } = props;
473
454
  return (
474
455
  <div className="query-builder-post-filter-tree__node__label__content">
475
456
  <PanelEntryDropZonePlaceholder
476
- showPlaceholder={isDragOver}
457
+ isDragOver={isDragOver}
458
+ isDroppable={isDroppable}
477
459
  label="Create Condition"
478
- className="query-builder__dnd__placeholder"
479
460
  >
480
- <div
481
- className={clsx('query-builder-post-filter-tree__blank-node', {
482
- 'query-builder-post-filter-tree__blank-node--droppable':
483
- showDroppableSuggestion,
484
- })}
485
- >
461
+ <div className="query-builder-post-filter-tree__blank-node">
486
462
  blank
487
463
  </div>
488
464
  </PanelEntryDropZonePlaceholder>
@@ -646,8 +622,8 @@ const QueryBuilderPostFilterTreeNodeContainer = observer(
646
622
  const onContextMenuOpen = (): void => setIsSelectedFromContextMenu(true);
647
623
  const onContextMenuClose = (): void => setIsSelectedFromContextMenu(false);
648
624
 
649
- const { showDroppableSuggestion } = useDragLayer((monitor) => ({
650
- showDroppableSuggestion:
625
+ const { isDroppable } = useDragLayer((monitor) => ({
626
+ isDroppable:
651
627
  monitor.isDragging() &&
652
628
  (monitor.getItemType() === QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE ||
653
629
  monitor.getItemType() === QUERY_BUILDER_WINDOW_COLUMN_DND_TYPE),
@@ -698,16 +674,12 @@ const QueryBuilderPostFilterTreeNodeContainer = observer(
698
674
  <div
699
675
  className={clsx(
700
676
  'tree-view__node__label query-builder-post-filter-tree__node__label',
701
- {
702
- 'query-builder-post-filter-tree__node__label--expandable':
703
- isExpandable,
704
- },
705
677
  )}
706
678
  >
707
679
  {node instanceof QueryBuilderPostFilterTreeGroupNodeData && (
708
680
  <QueryBuilderPostFilterGroupConditionEditor
709
681
  node={node}
710
- showDroppableSuggestion={showDroppableSuggestion}
682
+ isDroppable={isDroppable}
711
683
  isDragOver={isDragOver}
712
684
  />
713
685
  )}
@@ -722,7 +694,7 @@ const QueryBuilderPostFilterTreeNodeContainer = observer(
722
694
  <QueryBuilderPostFilterBlankConditionEditor
723
695
  node={node}
724
696
  isDragOver={isDragOver}
725
- showDroppableSuggestion={showDroppableSuggestion}
697
+ isDroppable={isDroppable}
726
698
  />
727
699
  )}
728
700
  </div>
@@ -962,8 +934,8 @@ const QueryBuilderPostFilterPanelContent = observer(
962
934
  const addPostFilterRef = useRef<HTMLInputElement>(null);
963
935
  dropTargetConnector(addPostFilterRef);
964
936
 
965
- const { showDroppableSuggestion } = useDragLayer((monitor) => ({
966
- showDroppableSuggestion:
937
+ const { isDroppable } = useDragLayer((monitor) => ({
938
+ isDroppable:
967
939
  monitor.isDragging() &&
968
940
  (monitor.getItemType() === QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE ||
969
941
  monitor.getItemType() === QUERY_BUILDER_WINDOW_COLUMN_DND_TYPE),
@@ -1055,10 +1027,7 @@ const QueryBuilderPostFilterPanelContent = observer(
1055
1027
  <PanelContent>
1056
1028
  <PanelDropZone
1057
1029
  isDragOver={isDragOver && postFilterState.isEmpty}
1058
- showDroppableSuggestion={
1059
- showDroppableSuggestion && postFilterState.isEmpty
1060
- }
1061
- className="query-builder__panel--droppable"
1030
+ isDroppable={isDroppable && postFilterState.isEmpty}
1062
1031
  dropTargetConnector={dropTargetConnector}
1063
1032
  >
1064
1033
  {postFilterState.isEmpty && (
@@ -1078,17 +1047,19 @@ const QueryBuilderPostFilterPanelContent = observer(
1078
1047
  <QueryBuilderPostFilterTree tdsState={tdsState} />
1079
1048
  </>
1080
1049
  )}
1081
- {showDroppableSuggestion && !postFilterState.isEmpty && (
1050
+ {isDroppable && !postFilterState.isEmpty && (
1082
1051
  <div
1083
1052
  ref={addPostFilterRef}
1084
- className={clsx(
1085
- 'query-builder-post-filter-tree__blank-node--droppable--tall',
1086
- {
1087
- 'dnd__entry--droppable__indicator--dragover': isDragOver,
1088
- },
1089
- )}
1053
+ className="query-builder-post-filter-tree__free-drop-zone__container"
1090
1054
  >
1091
- Add post-filter to main group
1055
+ <PanelEntryDropZonePlaceholder
1056
+ isDragOver={isDragOver}
1057
+ isDroppable={isDroppable}
1058
+ className="query-builder-post-filter-tree__free-drop-zone"
1059
+ label="Add post-filter to main group"
1060
+ >
1061
+ <></>{' '}
1062
+ </PanelEntryDropZonePlaceholder>
1092
1063
  </div>
1093
1064
  )}
1094
1065
  </PanelDropZone>