@finos/legend-application-query 5.0.2 → 5.2.2

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 (233) hide show
  1. package/lib/application/LegendQueryApplicationConfig.d.ts +19 -1
  2. package/lib/application/LegendQueryApplicationConfig.d.ts.map +1 -1
  3. package/lib/application/LegendQueryApplicationConfig.js +25 -1
  4. package/lib/application/LegendQueryApplicationConfig.js.map +1 -1
  5. package/lib/components/LegendQueryApplication.d.ts.map +1 -1
  6. package/lib/components/LegendQueryApplication.js +15 -5
  7. package/lib/components/LegendQueryApplication.js.map +1 -1
  8. package/lib/components/LegendQueryBaseStoreProvider.d.ts.map +1 -1
  9. package/lib/components/LegendQueryBaseStoreProvider.js +3 -1
  10. package/lib/components/LegendQueryBaseStoreProvider.js.map +1 -1
  11. package/lib/components/QueryBuilder.d.ts.map +1 -1
  12. package/lib/components/QueryBuilder.js +3 -1
  13. package/lib/components/QueryBuilder.js.map +1 -1
  14. package/lib/components/QueryBuilderExplorerPanel.d.ts.map +1 -1
  15. package/lib/components/QueryBuilderExplorerPanel.js +7 -34
  16. package/lib/components/QueryBuilderExplorerPanel.js.map +1 -1
  17. package/lib/components/QueryBuilderFetchStructurePanel.d.ts.map +1 -1
  18. package/lib/components/QueryBuilderFetchStructurePanel.js +77 -66
  19. package/lib/components/QueryBuilderFetchStructurePanel.js.map +1 -1
  20. package/lib/components/QueryBuilderFilterPanel.d.ts.map +1 -1
  21. package/lib/components/QueryBuilderFilterPanel.js +42 -59
  22. package/lib/components/QueryBuilderFilterPanel.js.map +1 -1
  23. package/lib/components/QueryBuilderFunctionsExplorerPanel.d.ts.map +1 -1
  24. package/lib/components/QueryBuilderFunctionsExplorerPanel.js +9 -39
  25. package/lib/components/QueryBuilderFunctionsExplorerPanel.js.map +1 -1
  26. package/lib/components/QueryBuilderGraphFetchTreePanel.d.ts.map +1 -1
  27. package/lib/components/QueryBuilderGraphFetchTreePanel.js +5 -5
  28. package/lib/components/QueryBuilderGraphFetchTreePanel.js.map +1 -1
  29. package/lib/components/QueryBuilderLambdaEditor.d.ts +1 -0
  30. package/lib/components/QueryBuilderLambdaEditor.d.ts.map +1 -1
  31. package/lib/components/QueryBuilderLambdaEditor.js +2 -2
  32. package/lib/components/QueryBuilderLambdaEditor.js.map +1 -1
  33. package/lib/components/QueryBuilderMilestoneEditor.js +5 -5
  34. package/lib/components/QueryBuilderMilestoneEditor.js.map +1 -1
  35. package/lib/components/QueryBuilderPanelIssueCountBadge.d.ts +20 -0
  36. package/lib/components/QueryBuilderPanelIssueCountBadge.d.ts.map +1 -0
  37. package/lib/components/QueryBuilderPanelIssueCountBadge.js +28 -0
  38. package/lib/components/QueryBuilderPanelIssueCountBadge.js.map +1 -0
  39. package/lib/components/QueryBuilderParameterPanel.d.ts.map +1 -1
  40. package/lib/components/QueryBuilderParameterPanel.js +13 -33
  41. package/lib/components/QueryBuilderParameterPanel.js.map +1 -1
  42. package/lib/components/QueryBuilderPostFilterPanel.d.ts.map +1 -1
  43. package/lib/components/QueryBuilderPostFilterPanel.js +47 -59
  44. package/lib/components/QueryBuilderPostFilterPanel.js.map +1 -1
  45. package/lib/components/QueryBuilderProjectionPanel.d.ts.map +1 -1
  46. package/lib/components/QueryBuilderProjectionPanel.js +47 -63
  47. package/lib/components/QueryBuilderProjectionPanel.js.map +1 -1
  48. package/lib/components/QueryBuilderPropertyExpressionEditor.d.ts.map +1 -1
  49. package/lib/components/QueryBuilderPropertyExpressionEditor.js +11 -11
  50. package/lib/components/QueryBuilderPropertyExpressionEditor.js.map +1 -1
  51. package/lib/components/QueryBuilderPropertySearchPanel.d.ts.map +1 -1
  52. package/lib/components/QueryBuilderPropertySearchPanel.js +3 -6
  53. package/lib/components/QueryBuilderPropertySearchPanel.js.map +1 -1
  54. package/lib/components/QueryBuilderResultModifierPanel.d.ts.map +1 -1
  55. package/lib/components/QueryBuilderResultModifierPanel.js +3 -1
  56. package/lib/components/QueryBuilderResultModifierPanel.js.map +1 -1
  57. package/lib/components/QueryBuilderResultPanel.d.ts.map +1 -1
  58. package/lib/components/QueryBuilderResultPanel.js +28 -18
  59. package/lib/components/QueryBuilderResultPanel.js.map +1 -1
  60. package/lib/components/QueryBuilderSetupPanel.d.ts.map +1 -1
  61. package/lib/components/QueryBuilderSetupPanel.js +10 -9
  62. package/lib/components/QueryBuilderSetupPanel.js.map +1 -1
  63. package/lib/components/QueryBuilderUnsupportedQueryEditor.d.ts.map +1 -1
  64. package/lib/components/QueryBuilderUnsupportedQueryEditor.js +4 -2
  65. package/lib/components/QueryBuilderUnsupportedQueryEditor.js.map +1 -1
  66. package/lib/components/QueryEditor.d.ts.map +1 -1
  67. package/lib/components/QueryEditor.js +16 -4
  68. package/lib/components/QueryEditor.js.map +1 -1
  69. package/lib/components/QueryEditorComponentTestUtils.d.ts +2 -0
  70. package/lib/components/QueryEditorComponentTestUtils.d.ts.map +1 -1
  71. package/lib/components/QueryEditorComponentTestUtils.js +3 -2
  72. package/lib/components/QueryEditorComponentTestUtils.js.map +1 -1
  73. package/lib/components/QueryEditorStoreProvider.d.ts.map +1 -1
  74. package/lib/components/QueryEditorStoreProvider.js +7 -3
  75. package/lib/components/QueryEditorStoreProvider.js.map +1 -1
  76. package/lib/components/QuerySetupStoreProvider.d.ts.map +1 -1
  77. package/lib/components/QuerySetupStoreProvider.js +3 -1
  78. package/lib/components/QuerySetupStoreProvider.js.map +1 -1
  79. package/lib/index.css +2 -2
  80. package/lib/index.css.map +1 -1
  81. package/lib/package.json +11 -9
  82. package/lib/stores/LegendQueryBaseStore.d.ts +4 -2
  83. package/lib/stores/LegendQueryBaseStore.d.ts.map +1 -1
  84. package/lib/stores/LegendQueryBaseStore.js +5 -1
  85. package/lib/stores/LegendQueryBaseStore.js.map +1 -1
  86. package/lib/stores/QueryBuilderExplorerState.d.ts.map +1 -1
  87. package/lib/stores/QueryBuilderExplorerState.js +5 -0
  88. package/lib/stores/QueryBuilderExplorerState.js.map +1 -1
  89. package/lib/stores/QueryBuilderFetchStructureState.d.ts +8 -1
  90. package/lib/stores/QueryBuilderFetchStructureState.d.ts.map +1 -1
  91. package/lib/stores/QueryBuilderFetchStructureState.js +10 -2
  92. package/lib/stores/QueryBuilderFetchStructureState.js.map +1 -1
  93. package/lib/stores/QueryBuilderFilterState.d.ts +8 -9
  94. package/lib/stores/QueryBuilderFilterState.d.ts.map +1 -1
  95. package/lib/stores/QueryBuilderFilterState.js +34 -13
  96. package/lib/stores/QueryBuilderFilterState.js.map +1 -1
  97. package/lib/stores/QueryBuilderGraphFetchTreeState.d.ts.map +1 -1
  98. package/lib/stores/QueryBuilderGraphFetchTreeState.js +6 -3
  99. package/lib/stores/QueryBuilderGraphFetchTreeState.js.map +1 -1
  100. package/lib/stores/QueryBuilderLambdaProcessor.d.ts.map +1 -1
  101. package/lib/stores/QueryBuilderLambdaProcessor.js +2 -0
  102. package/lib/stores/QueryBuilderLambdaProcessor.js.map +1 -1
  103. package/lib/stores/QueryBuilderOperatorLoader.d.ts +47 -0
  104. package/lib/stores/QueryBuilderOperatorLoader.d.ts.map +1 -0
  105. package/lib/stores/QueryBuilderOperatorLoader.js +94 -0
  106. package/lib/stores/QueryBuilderOperatorLoader.js.map +1 -0
  107. package/lib/stores/QueryBuilderPostFilterState.d.ts +9 -6
  108. package/lib/stores/QueryBuilderPostFilterState.d.ts.map +1 -1
  109. package/lib/stores/QueryBuilderPostFilterState.js +31 -7
  110. package/lib/stores/QueryBuilderPostFilterState.js.map +1 -1
  111. package/lib/stores/QueryBuilderPreviewDataHelper.d.ts +4 -3
  112. package/lib/stores/QueryBuilderPreviewDataHelper.d.ts.map +1 -1
  113. package/lib/stores/QueryBuilderPreviewDataHelper.js +77 -97
  114. package/lib/stores/QueryBuilderPreviewDataHelper.js.map +1 -1
  115. package/lib/stores/QueryBuilderProjectionState.d.ts +4 -8
  116. package/lib/stores/QueryBuilderProjectionState.d.ts.map +1 -1
  117. package/lib/stores/QueryBuilderProjectionState.js +17 -44
  118. package/lib/stores/QueryBuilderProjectionState.js.map +1 -1
  119. package/lib/stores/QueryBuilderSetupState.js +1 -1
  120. package/lib/stores/QueryBuilderSetupState.js.map +1 -1
  121. package/lib/stores/QueryBuilderState.d.ts +7 -1
  122. package/lib/stores/QueryBuilderState.d.ts.map +1 -1
  123. package/lib/stores/QueryBuilderState.js +17 -60
  124. package/lib/stores/QueryBuilderState.js.map +1 -1
  125. package/lib/stores/QueryBuilderTestUtils.d.ts +24 -0
  126. package/lib/stores/QueryBuilderTestUtils.d.ts.map +1 -0
  127. package/lib/stores/QueryBuilderTestUtils.js +49 -0
  128. package/lib/stores/QueryBuilderTestUtils.js.map +1 -0
  129. package/lib/stores/QueryBuilderTypeaheadHelper.d.ts +24 -0
  130. package/lib/stores/QueryBuilderTypeaheadHelper.d.ts.map +1 -0
  131. package/lib/stores/QueryBuilderTypeaheadHelper.js +89 -0
  132. package/lib/stores/QueryBuilderTypeaheadHelper.js.map +1 -0
  133. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.d.ts.map +1 -1
  134. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.js +7 -7
  135. package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.js.map +1 -1
  136. package/lib/stores/QueryEditorStore.d.ts +6 -4
  137. package/lib/stores/QueryEditorStore.d.ts.map +1 -1
  138. package/lib/stores/QueryEditorStore.js +23 -10
  139. package/lib/stores/QueryEditorStore.js.map +1 -1
  140. package/lib/stores/QueryEditorStoreTestUtils.d.ts.map +1 -1
  141. package/lib/stores/QueryEditorStoreTestUtils.js +1 -0
  142. package/lib/stores/QueryEditorStoreTestUtils.js.map +1 -1
  143. package/lib/stores/QueryFunctionsExplorerState.d.ts +2 -6
  144. package/lib/stores/QueryFunctionsExplorerState.d.ts.map +1 -1
  145. package/lib/stores/QueryFunctionsExplorerState.js +2 -11
  146. package/lib/stores/QueryFunctionsExplorerState.js.map +1 -1
  147. package/lib/stores/QueryParametersState.d.ts +1 -3
  148. package/lib/stores/QueryParametersState.d.ts.map +1 -1
  149. package/lib/stores/QueryParametersState.js +1 -4
  150. package/lib/stores/QueryParametersState.js.map +1 -1
  151. package/lib/stores/QuerySetupStore.d.ts +3 -1
  152. package/lib/stores/QuerySetupStore.d.ts.map +1 -1
  153. package/lib/stores/QuerySetupStore.js +3 -1
  154. package/lib/stores/QuerySetupStore.js.map +1 -1
  155. package/lib/stores/filterOperators/QueryBuilderFilterOperator_Equal.d.ts.map +1 -1
  156. package/lib/stores/filterOperators/QueryBuilderFilterOperator_Equal.js +4 -1
  157. package/lib/stores/filterOperators/QueryBuilderFilterOperator_Equal.js.map +1 -1
  158. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.d.ts.map +1 -1
  159. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.js +4 -1
  160. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.js.map +1 -1
  161. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.d.ts.map +1 -1
  162. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.js +4 -1
  163. package/lib/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.js.map +1 -1
  164. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThan.d.ts.map +1 -1
  165. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThan.js +4 -1
  166. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThan.js.map +1 -1
  167. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.d.ts.map +1 -1
  168. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.js +4 -1
  169. package/lib/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.js.map +1 -1
  170. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.d.ts.map +1 -1
  171. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.js +4 -1
  172. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.js.map +1 -1
  173. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.d.ts.map +1 -1
  174. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.js +4 -1
  175. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.js.map +1 -1
  176. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.d.ts.map +1 -1
  177. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.js +4 -1
  178. package/lib/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.js.map +1 -1
  179. package/package.json +18 -16
  180. package/src/application/LegendQueryApplicationConfig.ts +41 -2
  181. package/src/components/LegendQueryApplication.tsx +27 -10
  182. package/src/components/LegendQueryBaseStoreProvider.tsx +3 -0
  183. package/src/components/QueryBuilder.tsx +13 -2
  184. package/src/components/QueryBuilderExplorerPanel.tsx +17 -56
  185. package/src/components/QueryBuilderFetchStructurePanel.tsx +93 -77
  186. package/src/components/QueryBuilderFilterPanel.tsx +205 -219
  187. package/src/components/QueryBuilderFunctionsExplorerPanel.tsx +24 -68
  188. package/src/components/QueryBuilderGraphFetchTreePanel.tsx +34 -25
  189. package/src/components/QueryBuilderLambdaEditor.tsx +3 -0
  190. package/src/components/QueryBuilderMilestoneEditor.tsx +34 -34
  191. package/src/components/QueryBuilderPanelIssueCountBadge.tsx +38 -0
  192. package/src/components/QueryBuilderParameterPanel.tsx +23 -55
  193. package/src/components/QueryBuilderPostFilterPanel.tsx +223 -230
  194. package/src/components/QueryBuilderProjectionPanel.tsx +127 -154
  195. package/src/components/QueryBuilderPropertyExpressionEditor.tsx +61 -57
  196. package/src/components/QueryBuilderPropertySearchPanel.tsx +8 -9
  197. package/src/components/QueryBuilderResultModifierPanel.tsx +4 -2
  198. package/src/components/QueryBuilderResultPanel.tsx +75 -50
  199. package/src/components/QueryBuilderSetupPanel.tsx +13 -12
  200. package/src/components/QueryBuilderUnsupportedQueryEditor.tsx +4 -2
  201. package/src/components/QueryEditor.tsx +39 -1
  202. package/src/components/QueryEditorComponentTestUtils.tsx +15 -5
  203. package/src/components/QueryEditorStoreProvider.tsx +7 -0
  204. package/src/components/QuerySetupStoreProvider.tsx +3 -0
  205. package/src/stores/LegendQueryBaseStore.ts +14 -1
  206. package/src/stores/QueryBuilderExplorerState.ts +5 -0
  207. package/src/stores/QueryBuilderFetchStructureState.ts +18 -2
  208. package/src/stores/QueryBuilderFilterState.ts +50 -12
  209. package/src/stores/QueryBuilderGraphFetchTreeState.ts +14 -8
  210. package/src/stores/QueryBuilderLambdaProcessor.ts +8 -0
  211. package/src/stores/QueryBuilderOperatorLoader.ts +133 -0
  212. package/src/stores/QueryBuilderPostFilterState.ts +47 -8
  213. package/src/stores/QueryBuilderPreviewDataHelper.ts +122 -217
  214. package/src/stores/QueryBuilderProjectionState.ts +30 -58
  215. package/src/stores/QueryBuilderSetupState.ts +1 -1
  216. package/src/stores/QueryBuilderState.ts +33 -96
  217. package/src/stores/QueryBuilderTestUtils.ts +93 -0
  218. package/src/stores/QueryBuilderTypeaheadHelper.ts +149 -0
  219. package/src/stores/QueryBuilderValueSpecificationBuilderHelper.ts +9 -7
  220. package/src/stores/QueryEditorStore.ts +29 -6
  221. package/src/stores/QueryEditorStoreTestUtils.ts +1 -0
  222. package/src/stores/QueryFunctionsExplorerState.ts +1 -11
  223. package/src/stores/QueryParametersState.ts +1 -3
  224. package/src/stores/QuerySetupStore.ts +4 -0
  225. package/src/stores/filterOperators/QueryBuilderFilterOperator_Equal.ts +8 -1
  226. package/src/stores/filterOperators/QueryBuilderFilterOperator_GreaterThan.ts +8 -1
  227. package/src/stores/filterOperators/QueryBuilderFilterOperator_GreaterThanEqual.ts +8 -1
  228. package/src/stores/filterOperators/QueryBuilderFilterOperator_LessThan.ts +8 -1
  229. package/src/stores/filterOperators/QueryBuilderFilterOperator_LessThanEqual.ts +8 -1
  230. package/src/stores/postFilterOperators/QueryBuilderPostFilterOperator_Equal.ts +8 -1
  231. package/src/stores/postFilterOperators/QueryBuilderPostFilterOperator_GreaterThan.ts +8 -1
  232. package/src/stores/postFilterOperators/QueryBuilderPostFilterOperator_LessThan.ts +8 -1
  233. package/tsconfig.json +4 -0
@@ -14,6 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
+ import { useRef, useState } from 'react';
17
18
  import {
18
19
  clsx,
19
20
  CheckSquareIcon,
@@ -28,6 +29,7 @@ import {
28
29
  SearchIcon,
29
30
  ChevronDownIcon,
30
31
  ChevronRightIcon,
32
+ useDragPreviewLayer,
31
33
  } from '@finos/legend-art';
32
34
  import {
33
35
  Class,
@@ -37,9 +39,7 @@ import {
37
39
  } from '@finos/legend-graph';
38
40
  import { guaranteeNonNullable } from '@finos/legend-shared';
39
41
  import { observer } from 'mobx-react-lite';
40
- import { useEffect, useRef, useState } from 'react';
41
42
  import { useDrag } from 'react-dnd';
42
- import { getEmptyImage } from 'react-dnd-html5-backend';
43
43
  import { QUERY_BUILDER_PROPERTY_SEARCH_TYPE } from '../QueryBuilder_Const.js';
44
44
  import {
45
45
  type QueryBuilderExplorerTreeNodeData,
@@ -116,7 +116,9 @@ const QueryBuilderTreeNodeViewer = observer(
116
116
  props;
117
117
  const [isExpandable, setIsExpandable] = useState(false);
118
118
  const propertySearchPanelState = explorerState.propertySearchPanelState;
119
- const [, dragConnector, dragPreviewConnector] = useDrag(
119
+ const [, dragConnector, dragPreviewConnector] = useDrag<{
120
+ node?: QueryBuilderExplorerTreePropertyNodeData;
121
+ }>(
120
122
  () => ({
121
123
  type:
122
124
  node instanceof QueryBuilderExplorerTreePropertyNodeData
@@ -126,16 +128,17 @@ const QueryBuilderTreeNodeViewer = observer(
126
128
  ? QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.CLASS_PROPERTY
127
129
  : QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY
128
130
  : QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ROOT,
129
- item: (): { node?: QueryBuilderExplorerTreePropertyNodeData } =>
131
+ item: () =>
130
132
  node instanceof QueryBuilderExplorerTreePropertyNodeData
131
133
  ? { node }
132
134
  : {},
133
- collect: (monitor): { isDragging: boolean } => ({
135
+ collect: (monitor) => ({
134
136
  isDragging: monitor.isDragging(),
135
137
  }),
136
138
  }),
137
139
  [node],
138
140
  );
141
+ useDragPreviewLayer(dragPreviewConnector);
139
142
  const isMultiple =
140
143
  (node instanceof QueryBuilderExplorerTreePropertyNodeData &&
141
144
  (node.property.multiplicity.upperBound === undefined ||
@@ -186,10 +189,6 @@ const QueryBuilderTreeNodeViewer = observer(
186
189
  node.parentId === pn.id,
187
190
  );
188
191
 
189
- useEffect(() => {
190
- dragPreviewConnector(getEmptyImage(), { captureDraggingState: true });
191
- }, [dragPreviewConnector]);
192
-
193
192
  return (
194
193
  <div>
195
194
  <div
@@ -32,6 +32,7 @@ import {
32
32
  import type { QueryBuilderState } from '../stores/QueryBuilderState.js';
33
33
  import type { QueryBuilderProjectionColumnState } from '../stores/QueryBuilderProjectionState.js';
34
34
  import { guaranteeNonNullable } from '@finos/legend-shared';
35
+ import { useApplicationStore } from '@finos/legend-application';
35
36
 
36
37
  const ColumnSortEditor = observer(
37
38
  (props: {
@@ -39,6 +40,7 @@ const ColumnSortEditor = observer(
39
40
  columnSort: SortColumnState;
40
41
  }) => {
41
42
  const { queryBuilderState, columnSort } = props;
43
+ const applicationStore = useApplicationStore();
42
44
  const projectionState =
43
45
  queryBuilderState.fetchStructureState.projectionState;
44
46
  const sortColumns = queryBuilderState.resultSetModifierState.sortColumns;
@@ -81,7 +83,7 @@ const ColumnSortEditor = observer(
81
83
  disabled={projectionOptions.length <= 1}
82
84
  onChange={onChange}
83
85
  value={value}
84
- darkMode={true}
86
+ darkMode={!applicationStore.TEMPORARY__isLightThemeEnabled}
85
87
  />
86
88
  <button
87
89
  className="btn--dark btn--sm query-builder__projection__options__sort__type-btn"
@@ -95,7 +97,7 @@ const ColumnSortEditor = observer(
95
97
  )}
96
98
  </button>
97
99
  <button
98
- className="query-builder__projection__options__sort__remove-btn"
100
+ className="query-builder__projection__options__sort__remove-btn btn--dark btn--caution"
99
101
  onClick={deleteColumnSort}
100
102
  tabIndex={-1}
101
103
  title={'Remove'}
@@ -288,6 +288,61 @@ const QueryBuilderResultContextMenu = observer(
288
288
  }),
289
289
  );
290
290
 
291
+ const QueryBuilderGridResult = observer(
292
+ (props: {
293
+ executionResult: TdsExecutionResult;
294
+ queryBuilderState: QueryBuilderState;
295
+ }) => {
296
+ const { executionResult, queryBuilderState } = props;
297
+ const [cellDoubleClickedEvent, setCellDoubleClickedEvent] =
298
+ useState<CellMouseOverEvent | null>(null);
299
+ const columns = executionResult.result.columns;
300
+ const rowData = executionResult.result.rows.map((_row) => {
301
+ const row: Record<PropertyKey, unknown> = {};
302
+ const cols = executionResult.result.columns;
303
+ _row.values.forEach((value, idx) => {
304
+ // `ag-grid` shows `false` value as empty string so we have
305
+ // call `.toString()` to avoid this behavior.
306
+ // See https://github.com/finos/legend-studio/issues/1008
307
+ row[cols[idx] as string] = isBoolean(value) ? String(value) : value;
308
+ });
309
+ return row;
310
+ });
311
+
312
+ return (
313
+ <ContextMenu
314
+ content={
315
+ <QueryBuilderResultContextMenu
316
+ event={cellDoubleClickedEvent}
317
+ queryBuilderState={queryBuilderState}
318
+ />
319
+ }
320
+ menuProps={{ elevation: 7 }}
321
+ key={executionResult._UUID}
322
+ className={clsx('ag-theme-balham-dark query-builder__result__tds-grid')}
323
+ >
324
+ <AgGridReact
325
+ rowData={rowData}
326
+ onCellMouseOver={(event): void => {
327
+ setCellDoubleClickedEvent(event);
328
+ }}
329
+ >
330
+ {columns.map((colName) => (
331
+ <AgGridColumn
332
+ minWidth={50}
333
+ sortable={true}
334
+ resizable={true}
335
+ field={colName}
336
+ key={colName}
337
+ flex={1}
338
+ />
339
+ ))}
340
+ </AgGridReact>
341
+ </ContextMenu>
342
+ );
343
+ },
344
+ );
345
+
291
346
  const QueryBuilderResultValues = observer(
292
347
  (props: {
293
348
  executionResult: ExecutionResult;
@@ -295,52 +350,11 @@ const QueryBuilderResultValues = observer(
295
350
  }) => {
296
351
  const { executionResult, queryBuilderState } = props;
297
352
  if (executionResult instanceof TdsExecutionResult) {
298
- const [cellDoubleClickedEvent, setCellDoubleClickedEvent] =
299
- useState<CellMouseOverEvent | null>(null);
300
- const columns = executionResult.result.columns;
301
- const rowData = executionResult.result.rows.map((_row) => {
302
- const row: Record<PropertyKey, unknown> = {};
303
- const cols = executionResult.result.columns;
304
- _row.values.forEach((value, idx) => {
305
- // `ag-grid` shows `false` value as empty string so we have
306
- // call `.toString()` to avoid this behavior.
307
- // See https://github.com/finos/legend-studio/issues/1008
308
- row[cols[idx] as string] = isBoolean(value) ? String(value) : value;
309
- });
310
- return row;
311
- });
312
353
  return (
313
- <ContextMenu
314
- content={
315
- <QueryBuilderResultContextMenu
316
- event={cellDoubleClickedEvent}
317
- queryBuilderState={queryBuilderState}
318
- />
319
- }
320
- menuProps={{ elevation: 7 }}
321
- key={executionResult._UUID}
322
- className={clsx(
323
- 'ag-theme-balham-dark query-builder__result__tds-grid',
324
- )}
325
- >
326
- <AgGridReact
327
- rowData={rowData}
328
- onCellMouseOver={(event): void => {
329
- setCellDoubleClickedEvent(event);
330
- }}
331
- >
332
- {columns.map((colName) => (
333
- <AgGridColumn
334
- minWidth={50}
335
- sortable={true}
336
- resizable={true}
337
- field={colName}
338
- key={colName}
339
- flex={1}
340
- />
341
- ))}
342
- </AgGridReact>
343
- </ContextMenu>
354
+ <QueryBuilderGridResult
355
+ queryBuilderState={queryBuilderState}
356
+ executionResult={executionResult}
357
+ />
344
358
  );
345
359
  } else if (executionResult instanceof RawExecutionResult) {
346
360
  return (
@@ -414,6 +428,9 @@ export const QueryBuilderResultPanel = observer(
414
428
  ],
415
429
  });
416
430
  };
431
+ const queryValidationIssues = queryBuilderState.validationIssues;
432
+ const isQueryValid =
433
+ !queryBuilderState.isQuerySupported() || !queryValidationIssues;
417
434
  const runQuery = (): void => {
418
435
  if (queryParametersState.parameterStates.length) {
419
436
  queryParametersState.parameterValuesEditorState.open(
@@ -439,6 +456,7 @@ export const QueryBuilderResultPanel = observer(
439
456
  const debugPlanGeneration = applicationStore.guardUnhandledError(() =>
440
457
  flowResult(resultState.generatePlan(true)),
441
458
  );
459
+
442
460
  const changeLimit: React.ChangeEventHandler<HTMLInputElement> = (event) => {
443
461
  const val = event.target.value;
444
462
  queryBuilderState.resultState.setPreviewLimit(
@@ -474,7 +492,7 @@ export const QueryBuilderResultPanel = observer(
474
492
  type="number"
475
493
  value={resultState.previewLimit}
476
494
  onChange={changeLimit}
477
- disabled={!queryBuilderState.isValidQueryBuilderState()}
495
+ disabled={!isQueryValid}
478
496
  />
479
497
  </div>
480
498
  )}
@@ -483,7 +501,7 @@ export const QueryBuilderResultPanel = observer(
483
501
  className="query-builder__result__stop-btn"
484
502
  onClick={cancelQuery}
485
503
  tabIndex={-1}
486
- disabled={!queryBuilderState.isValidQueryBuilderState()}
504
+ disabled={!isQueryValid}
487
505
  >
488
506
  <div className="btn--dark btn--caution query-builder__result__stop-btn__label">
489
507
  <PauseCircleIcon className="query-builder__result__stop-btn__label__icon" />
@@ -497,7 +515,14 @@ export const QueryBuilderResultPanel = observer(
497
515
  className="query-builder__result__execute-btn"
498
516
  onClick={runQuery}
499
517
  tabIndex={-1}
500
- disabled={!queryBuilderState.isValidQueryBuilderState()}
518
+ title={
519
+ queryValidationIssues
520
+ ? `Query is not valid:\n${queryValidationIssues
521
+ .map((issue) => `\u2022 ${issue}`)
522
+ .join('\n')}`
523
+ : undefined
524
+ }
525
+ disabled={!isQueryValid}
501
526
  >
502
527
  <div className="query-builder__result__execute-btn__label">
503
528
  <PlayIcon className="query-builder__result__execute-btn__label__icon" />
@@ -560,14 +585,14 @@ export const QueryBuilderResultPanel = observer(
560
585
  className="query-builder__result__export__dropdown__label"
561
586
  tabIndex={-1}
562
587
  title="Export"
563
- disabled={!queryBuilderState.isValidQueryBuilderState()}
588
+ disabled={!isQueryValid}
564
589
  >
565
590
  Export
566
591
  </button>
567
592
  <button
568
593
  className="query-builder__result__export__dropdown__trigger"
569
594
  tabIndex={-1}
570
- disabled={!queryBuilderState.isValidQueryBuilderState()}
595
+ disabled={!isQueryValid}
571
596
  >
572
597
  <CaretDownIcon />
573
598
  </button>
@@ -21,7 +21,6 @@ import {
21
21
  PURE_ClassIcon,
22
22
  PURE_MappingIcon,
23
23
  PURE_RuntimeIcon,
24
- EyeIcon,
25
24
  ClockIcon,
26
25
  clsx,
27
26
  } from '@finos/legend-art';
@@ -46,8 +45,9 @@ import {
46
45
  } from '@finos/legend-graph';
47
46
  import {
48
47
  type PackageableElementOption,
49
- getPackageableElementOptionalFormatter,
48
+ getPackageableElementOptionFormatter,
50
49
  buildElementOption,
50
+ useApplicationStore,
51
51
  } from '@finos/legend-application';
52
52
  import { MilestoningParametersEditor } from './QueryBuilderMilestoneEditor.js';
53
53
  import { useState } from 'react';
@@ -124,8 +124,8 @@ const generateClassLabel = (
124
124
  >
125
125
  {val.name}
126
126
  </div>
127
- <EyeIcon
128
- className="query-builder__setup__config__item__class-label__btn"
127
+ <ClockIcon
128
+ className="query-builder__setup__config__item__class-label__milestoning"
129
129
  title={milestoningParameterValues}
130
130
  />
131
131
  </div>
@@ -151,6 +151,7 @@ const generateClassLabel = (
151
151
  export const QueryBuilderSetupPanel = observer(
152
152
  (props: { queryBuilderState: QueryBuilderState }) => {
153
153
  const { queryBuilderState } = props;
154
+ const applicationStore = useApplicationStore();
154
155
  const querySetupState = queryBuilderState.querySetupState;
155
156
  const [isMilestoneEditorOpened, setIsMilestoneEditorOpened] =
156
157
  useState<boolean>(false);
@@ -266,15 +267,15 @@ export const QueryBuilderSetupPanel = observer(
266
267
  options={classOptions}
267
268
  onChange={changeClass}
268
269
  value={selectedClassOption}
269
- darkMode={true}
270
+ darkMode={!applicationStore.TEMPORARY__isLightThemeEnabled}
270
271
  disabled={!isQuerySupported || querySetupState.classIsReadOnly}
271
272
  filterOption={elementFilterOption}
272
- formatOptionLabel={getPackageableElementOptionalFormatter({
273
- darkMode: true,
273
+ formatOptionLabel={getPackageableElementOptionFormatter({
274
+ darkMode: !applicationStore.TEMPORARY__isLightThemeEnabled,
274
275
  })}
275
276
  />
276
277
  <button
277
- className="btn--dark btn__icon--dark"
278
+ className="btn--dark btn__icon--dark query-builder__setup__milestoning"
278
279
  tabIndex={-1}
279
280
  onClick={(): void => setIsMilestoneEditorOpened(true)}
280
281
  disabled={!isMilestonedQuery}
@@ -302,10 +303,10 @@ export const QueryBuilderSetupPanel = observer(
302
303
  options={mappingOptions}
303
304
  onChange={changeMapping}
304
305
  value={selectedMappingOption}
305
- darkMode={true}
306
+ darkMode={!applicationStore.TEMPORARY__isLightThemeEnabled}
306
307
  filterOption={elementFilterOption}
307
- formatOptionLabel={getPackageableElementOptionalFormatter({
308
- darkMode: true,
308
+ formatOptionLabel={getPackageableElementOptionFormatter({
309
+ darkMode: !applicationStore.TEMPORARY__isLightThemeEnabled,
309
310
  })}
310
311
  />
311
312
  </div>
@@ -330,7 +331,7 @@ export const QueryBuilderSetupPanel = observer(
330
331
  options={runtimeOptions}
331
332
  onChange={changeRuntime}
332
333
  value={selectedRuntimeOption}
333
- darkMode={true}
334
+ darkMode={!applicationStore.TEMPORARY__isLightThemeEnabled}
334
335
  filterOption={runtimeFilterOption}
335
336
  />
336
337
  </div>
@@ -48,7 +48,9 @@ const QueryBuilderUnsupportedQueryEditPanel = observer(
48
48
  const { queryBuilderState } = props;
49
49
  const queryUnsupportedState = queryBuilderState.queryUnsupportedState;
50
50
  const lambdaError = queryUnsupportedState.lambdaError;
51
- const errorMessage = lambdaError ? `due to: ${lambdaError.message}` : '';
51
+ const errorMessage = lambdaError?.message
52
+ ? ` due to: ${lambdaError.message}`
53
+ : '';
52
54
  const openLambdaModal = (): void =>
53
55
  queryBuilderState.queryTextEditorState.openModal(
54
56
  QueryTextEditorMode.TEXT,
@@ -63,7 +65,7 @@ const QueryBuilderUnsupportedQueryEditPanel = observer(
63
65
  <div className="panel__content">
64
66
  <BlankPanelContent>
65
67
  <div className="query-builder__unsupported-view__main">
66
- <div className="query-builder__unsupported-view__summary">{`Can't display query in form mode ${errorMessage}`}</div>
68
+ <div className="query-builder__unsupported-view__summary">{`Can't display query in form mode${errorMessage}`}</div>
67
69
  <button
68
70
  className="btn--dark query-builder__unsupported-view__to-text-mode__btn"
69
71
  onClick={openLambdaModal}
@@ -22,6 +22,9 @@ import {
22
22
  RobotIcon,
23
23
  SaveIcon,
24
24
  BlankPanelContent,
25
+ clsx,
26
+ EmptyLightBulbIcon,
27
+ LightBulbIcon,
25
28
  } from '@finos/legend-art';
26
29
  import { getQueryParameters } from '@finos/legend-shared';
27
30
  import { observer } from 'mobx-react-lite';
@@ -108,6 +111,8 @@ const QueryExportDialogContent = observer(
108
111
  )}
109
112
  <button
110
113
  className="btn modal__footer__close-btn btn--dark"
114
+ // TODO?: we should probably annotate here why,
115
+ // when we disable this action
111
116
  disabled={!allowCreate}
112
117
  onClick={create}
113
118
  >
@@ -199,6 +204,10 @@ const QueryEditorHeaderContent = observer(() => {
199
204
  ),
200
205
  );
201
206
  };
207
+ const toggleLightDarkTheme = (): void =>
208
+ applicationStore.TEMPORARY__setIsLightThemeEnabled(
209
+ !applicationStore.TEMPORARY__isLightThemeEnabled,
210
+ );
202
211
  const saveQuery = (): void => {
203
212
  editorStore.queryBuilderState
204
213
  .saveQuery(async (lambda: RawLambda) => {
@@ -227,6 +236,20 @@ const QueryEditorHeaderContent = observer(() => {
227
236
  >
228
237
  <ExternalLinkSquareIcon />
229
238
  </button>
239
+ {applicationStore.config.options.TEMPORARY__enableThemeSwitcher && (
240
+ <button
241
+ className="query-editor__header__action query-editor__header__action--simple btn--dark"
242
+ tabIndex={-1}
243
+ title="Toggle Light/Dark Theme"
244
+ onClick={toggleLightDarkTheme}
245
+ >
246
+ {applicationStore.TEMPORARY__isLightThemeEnabled ? (
247
+ <EmptyLightBulbIcon />
248
+ ) : (
249
+ <LightBulbIcon />
250
+ )}
251
+ </button>
252
+ )}
230
253
  <button
231
254
  className="query-editor__header__action btn--dark"
232
255
  tabIndex={-1}
@@ -256,9 +279,24 @@ export const QueryEditor = observer(() => {
256
279
  );
257
280
  }, [editorStore, applicationStore]);
258
281
 
282
+ useEffect(() => {
283
+ document.body.classList.toggle(
284
+ 'light-theme',
285
+ applicationStore.TEMPORARY__isLightThemeEnabled,
286
+ );
287
+ }, [applicationStore.TEMPORARY__isLightThemeEnabled]);
288
+
259
289
  return (
260
290
  <DndProvider backend={HTML5Backend}>
261
- <div className="query-editor">
291
+ <div
292
+ className={clsx([
293
+ 'query-editor ',
294
+ {
295
+ 'query-editor--light':
296
+ applicationStore.TEMPORARY__isLightThemeEnabled,
297
+ },
298
+ ])}
299
+ >
262
300
  <div className="query-editor__header">
263
301
  <button
264
302
  className="query-editor__header__back-btn btn--dark"
@@ -42,6 +42,11 @@ import {
42
42
  WebApplicationNavigator,
43
43
  TEST__getTestApplicationStore,
44
44
  } from '@finos/legend-application';
45
+ import {
46
+ type SDLCServerClient,
47
+ TEST__SDLCServerClientProvider,
48
+ TEST__getTestSDLCServerClient,
49
+ } from '@finos/legend-server-sdlc';
45
50
  import { TEST__getTestLegendQueryApplicationConfig } from '../stores/QueryEditorStoreTestUtils.js';
46
51
  import { LegendQueryPluginManager } from '../application/LegendQueryPluginManager.js';
47
52
  import { ExistingQueryEditor } from './QueryEditor.js';
@@ -68,6 +73,8 @@ export const TEST__provideMockedQueryEditorStore = (customization?: {
68
73
  mock?: ExistingQueryEditorStore;
69
74
  applicationStore?: LegendQueryApplicationStore;
70
75
  depotServerClient?: DepotServerClient;
76
+ sdlcServerClient?: SDLCServerClient;
77
+
71
78
  graphManagerState?: GraphManagerState;
72
79
  pluginManager?: LegendQueryPluginManager;
73
80
  }): ExistingQueryEditorStore => {
@@ -82,6 +89,7 @@ export const TEST__provideMockedQueryEditorStore = (customization?: {
82
89
  pluginManager,
83
90
  ),
84
91
  customization?.depotServerClient ?? TEST__getTestDepotServerClient(),
92
+ customization?.sdlcServerClient ?? TEST__getTestSDLCServerClient(),
85
93
  pluginManager,
86
94
  TEST_QUERY_ID,
87
95
  );
@@ -185,11 +193,13 @@ export const TEST__setUpQueryEditor = async (
185
193
  config={TEST__getTestLegendQueryApplicationConfig()}
186
194
  pluginManager={LegendQueryPluginManager.create()}
187
195
  >
188
- <TEST__DepotServerClientProvider>
189
- <TEST__LegendQueryBaseStoreProvider>
190
- <ExistingQueryEditor />
191
- </TEST__LegendQueryBaseStoreProvider>
192
- </TEST__DepotServerClientProvider>
196
+ <TEST__SDLCServerClientProvider>
197
+ <TEST__DepotServerClientProvider>
198
+ <TEST__LegendQueryBaseStoreProvider>
199
+ <ExistingQueryEditor />
200
+ </TEST__LegendQueryBaseStoreProvider>
201
+ </TEST__DepotServerClientProvider>
202
+ </TEST__SDLCServerClientProvider>
193
203
  </TEST__ApplicationStoreProvider>
194
204
  </Router>,
195
205
  );
@@ -31,6 +31,7 @@ import {
31
31
  useLegendQueryApplicationStore,
32
32
  useLegendQueryBaseStore,
33
33
  } from './LegendQueryBaseStoreProvider.js';
34
+ import { useSDLCServerClient } from '@finos/legend-server-sdlc';
34
35
 
35
36
  export const QueryEditorStoreContext = createContext<
36
37
  QueryEditorStore | undefined
@@ -42,12 +43,14 @@ export const ExistingQueryEditorStoreProvider: React.FC<{
42
43
  }> = ({ children, queryId }) => {
43
44
  const applicationStore = useLegendQueryApplicationStore();
44
45
  const depotServerClient = useDepotServerClient();
46
+ const sdlcServerClient = useSDLCServerClient();
45
47
  const baseStore = useLegendQueryBaseStore();
46
48
  const store = useLocalObservable(
47
49
  () =>
48
50
  new ExistingQueryEditorStore(
49
51
  applicationStore,
50
52
  depotServerClient,
53
+ sdlcServerClient,
51
54
  baseStore.pluginManager,
52
55
  queryId,
53
56
  ),
@@ -69,12 +72,14 @@ export const CreateQueryEditorStoreProvider: React.FC<{
69
72
  const { groupId, artifactId, versionId } = parseGAVCoordinates(gav);
70
73
  const applicationStore = useLegendQueryApplicationStore();
71
74
  const depotServerClient = useDepotServerClient();
75
+ const sdlcServerClient = useSDLCServerClient();
72
76
  const baseStore = useLegendQueryBaseStore();
73
77
  const store = useLocalObservable(
74
78
  () =>
75
79
  new CreateQueryEditorStore(
76
80
  applicationStore,
77
81
  depotServerClient,
82
+ sdlcServerClient,
78
83
  baseStore.pluginManager,
79
84
  groupId,
80
85
  artifactId,
@@ -100,12 +105,14 @@ export const ServiceQueryEditorStoreProvider: React.FC<{
100
105
  const { groupId, artifactId, versionId } = parseGAVCoordinates(gav);
101
106
  const applicationStore = useLegendQueryApplicationStore();
102
107
  const depotServerClient = useDepotServerClient();
108
+ const sdlcServerClient = useSDLCServerClient();
103
109
  const baseStore = useLegendQueryBaseStore();
104
110
  const store = useLocalObservable(
105
111
  () =>
106
112
  new ServiceQueryEditorStore(
107
113
  applicationStore,
108
114
  depotServerClient,
115
+ sdlcServerClient,
109
116
  baseStore.pluginManager,
110
117
  groupId,
111
118
  artifactId,
@@ -23,6 +23,7 @@ import {
23
23
  useLegendQueryApplicationStore,
24
24
  useLegendQueryBaseStore,
25
25
  } from './LegendQueryBaseStoreProvider.js';
26
+ import { useSDLCServerClient } from '@finos/legend-server-sdlc';
26
27
 
27
28
  const QuerySetupStoreContext = createContext<QuerySetupStore | undefined>(
28
29
  undefined,
@@ -34,11 +35,13 @@ export const QuerySetupStoreProvider: React.FC<{
34
35
  const applicationStore = useLegendQueryApplicationStore();
35
36
  const depotServerClient = useDepotServerClient();
36
37
  const baseStore = useLegendQueryBaseStore();
38
+ const sdlcServerClient = useSDLCServerClient();
37
39
  const store = useLocalObservable(
38
40
  () =>
39
41
  new QuerySetupStore(
40
42
  applicationStore,
41
43
  depotServerClient,
44
+ sdlcServerClient,
42
45
  baseStore.pluginManager,
43
46
  ),
44
47
  );
@@ -15,10 +15,14 @@
15
15
  */
16
16
 
17
17
  import type { DepotServerClient } from '@finos/legend-server-depot';
18
- import type { ApplicationStore } from '@finos/legend-application';
18
+ import {
19
+ type ApplicationStore,
20
+ LegendApplicationSDLCSetupState,
21
+ } from '@finos/legend-application';
19
22
  import type { LegendQueryPluginManager } from '../application/LegendQueryPluginManager.js';
20
23
  import type { LegendQueryApplicationConfig } from '../application/LegendQueryApplicationConfig.js';
21
24
  import type { LegendQueryApplicationPlugin } from './LegendQueryApplicationPlugin.js';
25
+ import type { SDLCServerClient } from '@finos/legend-server-sdlc';
22
26
 
23
27
  export type LegendQueryApplicationStore = ApplicationStore<
24
28
  LegendQueryApplicationConfig,
@@ -29,17 +33,26 @@ export class LegendQueryBaseStore {
29
33
  applicationStore: LegendQueryApplicationStore;
30
34
  depotServerClient: DepotServerClient;
31
35
  pluginManager: LegendQueryPluginManager;
36
+ applicationSDLCSetupState: LegendApplicationSDLCSetupState;
32
37
 
33
38
  constructor(
34
39
  applicationStore: LegendQueryApplicationStore,
35
40
  depotServerClient: DepotServerClient,
41
+ sdlcServerClient: SDLCServerClient,
36
42
  pluginManager: LegendQueryPluginManager,
37
43
  ) {
38
44
  this.applicationStore = applicationStore;
45
+ this.applicationSDLCSetupState = new LegendApplicationSDLCSetupState(
46
+ applicationStore,
47
+ sdlcServerClient,
48
+ );
39
49
  this.depotServerClient = depotServerClient;
40
50
  this.pluginManager = pluginManager;
41
51
 
42
52
  // Register plugins
53
+ this.applicationSDLCSetupState.sdlcServerClient.setTracerService(
54
+ this.applicationStore.tracerService,
55
+ );
43
56
  this.depotServerClient.setTracerService(
44
57
  this.applicationStore.tracerService,
45
58
  );
@@ -355,6 +355,11 @@ export const getQueryBuilderPropertyNodeData = (
355
355
  parentNode.isPartOfDerivedPropertyBranch ||
356
356
  (parentNode instanceof QueryBuilderExplorerTreePropertyNodeData &&
357
357
  parentNode.property instanceof DerivedProperty);
358
+ // NOTE: in case of association, to avoid infinite exploration path
359
+ // we will prune it, on the other hand, in circular composition case
360
+ // A has property of type B and B has property of type A
361
+ // we will allow users to explore as deeply as they wish
362
+ // See https://github.com/finos/legend-studio/issues/1172
358
363
  if (
359
364
  property instanceof Property &&
360
365
  parentNode instanceof QueryBuilderExplorerTreePropertyNodeData &&