@finos/legend-data-cube 0.1.11 → 0.1.13

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 (175) hide show
  1. package/lib/components/DataCubePlaceholder.d.ts.map +1 -1
  2. package/lib/components/DataCubePlaceholder.js +2 -1
  3. package/lib/components/DataCubePlaceholder.js.map +1 -1
  4. package/lib/components/core/DataCubePureCodeEditorUtils.d.ts +2 -1
  5. package/lib/components/core/DataCubePureCodeEditorUtils.d.ts.map +1 -1
  6. package/lib/components/core/DataCubePureCodeEditorUtils.js.map +1 -1
  7. package/lib/components/view/editor/DataCubeEditor.d.ts.map +1 -1
  8. package/lib/components/view/editor/DataCubeEditor.js +4 -2
  9. package/lib/components/view/editor/DataCubeEditor.js.map +1 -1
  10. package/lib/components/view/editor/DataCubeEditorColumnsPanel.d.ts.map +1 -1
  11. package/lib/components/view/editor/DataCubeEditorColumnsPanel.js +3 -3
  12. package/lib/components/view/editor/DataCubeEditorColumnsPanel.js.map +1 -1
  13. package/lib/components/view/editor/DataCubeEditorColumnsSelector.d.ts +47 -0
  14. package/lib/components/view/editor/DataCubeEditorColumnsSelector.d.ts.map +1 -0
  15. package/lib/components/view/editor/{DataCubeEditorColumnSelector.js → DataCubeEditorColumnsSelector.js} +70 -55
  16. package/lib/components/view/editor/DataCubeEditorColumnsSelector.js.map +1 -0
  17. package/lib/components/view/editor/DataCubeEditorDimensionsPanel.d.ts +3 -13
  18. package/lib/components/view/editor/DataCubeEditorDimensionsPanel.d.ts.map +1 -1
  19. package/lib/components/view/editor/DataCubeEditorDimensionsPanel.js +707 -264
  20. package/lib/components/view/editor/DataCubeEditorDimensionsPanel.js.map +1 -1
  21. package/lib/components/view/editor/DataCubeEditorHorizontalPivotsPanel.js +2 -2
  22. package/lib/components/view/editor/DataCubeEditorHorizontalPivotsPanel.js.map +1 -1
  23. package/lib/components/view/editor/DataCubeEditorSortsPanel.js +2 -2
  24. package/lib/components/view/editor/DataCubeEditorSortsPanel.js.map +1 -1
  25. package/lib/components/view/editor/DataCubeEditorVerticalPivotsPanel.js +2 -2
  26. package/lib/components/view/editor/DataCubeEditorVerticalPivotsPanel.js.map +1 -1
  27. package/lib/components/view/{grid/DataCubeGridShared.d.ts → extend/DataCubeCodeEditor.d.ts} +7 -3
  28. package/lib/components/view/extend/DataCubeCodeEditor.d.ts.map +1 -0
  29. package/lib/components/view/extend/DataCubeCodeEditor.js +114 -0
  30. package/lib/components/view/extend/DataCubeCodeEditor.js.map +1 -0
  31. package/lib/components/view/extend/DataCubeCodeEditorState.d.ts +43 -0
  32. package/lib/components/view/extend/DataCubeCodeEditorState.d.ts.map +1 -0
  33. package/lib/components/view/extend/DataCubeCodeEditorState.js +37 -0
  34. package/lib/components/view/extend/DataCubeCodeEditorState.js.map +1 -0
  35. package/lib/components/view/extend/DataCubeColumnEditor.d.ts.map +1 -1
  36. package/lib/components/view/extend/DataCubeColumnEditor.js +5 -84
  37. package/lib/components/view/extend/DataCubeColumnEditor.js.map +1 -1
  38. package/lib/components/view/grid/DataCubeGrid.d.ts +2 -1
  39. package/lib/components/view/grid/DataCubeGrid.d.ts.map +1 -1
  40. package/lib/components/view/grid/DataCubeGrid.js +29 -19
  41. package/lib/components/view/grid/DataCubeGrid.js.map +1 -1
  42. package/lib/components/view/grid/DataCubeMultidimensionalGrid.d.ts +1 -1
  43. package/lib/components/view/grid/DataCubeMultidimensionalGrid.d.ts.map +1 -1
  44. package/lib/components/view/grid/DataCubeMultidimensionalGrid.js +2 -1
  45. package/lib/components/view/grid/DataCubeMultidimensionalGrid.js.map +1 -1
  46. package/lib/index.css +2 -2
  47. package/lib/index.css.map +1 -1
  48. package/lib/index.d.ts +3 -0
  49. package/lib/index.d.ts.map +1 -1
  50. package/lib/index.js +3 -0
  51. package/lib/index.js.map +1 -1
  52. package/lib/package.json +1 -1
  53. package/lib/stores/DataCubeAPI.d.ts.map +1 -1
  54. package/lib/stores/DataCubeAPI.js +3 -1
  55. package/lib/stores/DataCubeAPI.js.map +1 -1
  56. package/lib/stores/core/DataCubeEngine.d.ts +1 -1
  57. package/lib/stores/core/DataCubeEngine.d.ts.map +1 -1
  58. package/lib/stores/core/DataCubeQueryEngine.d.ts +5 -0
  59. package/lib/stores/core/DataCubeQueryEngine.d.ts.map +1 -1
  60. package/lib/stores/core/DataCubeQueryEngine.js +6 -0
  61. package/lib/stores/core/DataCubeQueryEngine.js.map +1 -1
  62. package/lib/stores/core/DataCubeSnapshot.d.ts +1 -1
  63. package/lib/stores/core/DataCubeSnapshot.d.ts.map +1 -1
  64. package/lib/stores/core/model/AdhocQueryDataCubeSource.d.ts +2 -0
  65. package/lib/stores/core/model/AdhocQueryDataCubeSource.d.ts.map +1 -1
  66. package/lib/stores/core/model/AdhocQueryDataCubeSource.js +3 -0
  67. package/lib/stores/core/model/AdhocQueryDataCubeSource.js.map +1 -1
  68. package/lib/stores/core/model/DataCubeConfiguration.d.ts +11 -0
  69. package/lib/stores/core/model/DataCubeConfiguration.d.ts.map +1 -1
  70. package/lib/stores/core/model/DataCubeConfiguration.js +19 -1
  71. package/lib/stores/core/model/DataCubeConfiguration.js.map +1 -1
  72. package/lib/stores/services/DataCubeSettingService.d.ts.map +1 -1
  73. package/lib/stores/services/DataCubeSettingService.js +10 -6
  74. package/lib/stores/services/DataCubeSettingService.js.map +1 -1
  75. package/lib/stores/view/DataCubeInfoState.d.ts +2 -0
  76. package/lib/stores/view/DataCubeInfoState.d.ts.map +1 -1
  77. package/lib/stores/view/DataCubeInfoState.js +3 -0
  78. package/lib/stores/view/DataCubeInfoState.js.map +1 -1
  79. package/lib/stores/view/editor/DataCubeEditorColumnsPanelState.d.ts +8 -8
  80. package/lib/stores/view/editor/DataCubeEditorColumnsPanelState.d.ts.map +1 -1
  81. package/lib/stores/view/editor/DataCubeEditorColumnsPanelState.js +6 -6
  82. package/lib/stores/view/editor/DataCubeEditorColumnsPanelState.js.map +1 -1
  83. package/lib/stores/view/editor/{DataCubeEditorColumnSelectorState.d.ts → DataCubeEditorColumnsSelectorState.d.ts} +6 -6
  84. package/lib/stores/view/editor/DataCubeEditorColumnsSelectorState.d.ts.map +1 -0
  85. package/lib/stores/view/editor/{DataCubeEditorColumnSelectorState.js → DataCubeEditorColumnsSelectorState.js} +4 -4
  86. package/lib/stores/view/editor/DataCubeEditorColumnsSelectorState.js.map +1 -0
  87. package/lib/stores/view/editor/DataCubeEditorDimensionsPanelState.d.ts +29 -6
  88. package/lib/stores/view/editor/DataCubeEditorDimensionsPanelState.d.ts.map +1 -1
  89. package/lib/stores/view/editor/DataCubeEditorDimensionsPanelState.js +102 -39
  90. package/lib/stores/view/editor/DataCubeEditorDimensionsPanelState.js.map +1 -1
  91. package/lib/stores/view/editor/DataCubeEditorHorizontalPivotsPanelState.d.ts +5 -5
  92. package/lib/stores/view/editor/DataCubeEditorHorizontalPivotsPanelState.d.ts.map +1 -1
  93. package/lib/stores/view/editor/DataCubeEditorHorizontalPivotsPanelState.js +7 -6
  94. package/lib/stores/view/editor/DataCubeEditorHorizontalPivotsPanelState.js.map +1 -1
  95. package/lib/stores/view/editor/DataCubeEditorMutableConfiguration.d.ts +2 -1
  96. package/lib/stores/view/editor/DataCubeEditorMutableConfiguration.d.ts.map +1 -1
  97. package/lib/stores/view/editor/DataCubeEditorMutableConfiguration.js +5 -0
  98. package/lib/stores/view/editor/DataCubeEditorMutableConfiguration.js.map +1 -1
  99. package/lib/stores/view/editor/DataCubeEditorSortsPanelState.d.ts +5 -5
  100. package/lib/stores/view/editor/DataCubeEditorSortsPanelState.d.ts.map +1 -1
  101. package/lib/stores/view/editor/DataCubeEditorSortsPanelState.js +6 -6
  102. package/lib/stores/view/editor/DataCubeEditorSortsPanelState.js.map +1 -1
  103. package/lib/stores/view/editor/DataCubeEditorState.d.ts +3 -0
  104. package/lib/stores/view/editor/DataCubeEditorState.d.ts.map +1 -1
  105. package/lib/stores/view/editor/DataCubeEditorState.js +6 -0
  106. package/lib/stores/view/editor/DataCubeEditorState.js.map +1 -1
  107. package/lib/stores/view/editor/DataCubeEditorVerticalPivotsPanelState.d.ts +5 -5
  108. package/lib/stores/view/editor/DataCubeEditorVerticalPivotsPanelState.d.ts.map +1 -1
  109. package/lib/stores/view/editor/DataCubeEditorVerticalPivotsPanelState.js +6 -6
  110. package/lib/stores/view/editor/DataCubeEditorVerticalPivotsPanelState.js.map +1 -1
  111. package/lib/stores/view/extend/DataCubeColumnEditorState.d.ts +7 -14
  112. package/lib/stores/view/extend/DataCubeColumnEditorState.d.ts.map +1 -1
  113. package/lib/stores/view/extend/DataCubeColumnEditorState.js +14 -22
  114. package/lib/stores/view/extend/DataCubeColumnEditorState.js.map +1 -1
  115. package/lib/stores/view/grid/DataCubeGridClientEngine.d.ts +2 -1
  116. package/lib/stores/view/grid/DataCubeGridClientEngine.d.ts.map +1 -1
  117. package/lib/stores/view/grid/DataCubeGridClientEngine.js +7 -0
  118. package/lib/stores/view/grid/DataCubeGridClientEngine.js.map +1 -1
  119. package/lib/stores/view/grid/DataCubeGridClientExportEngine.js +1 -1
  120. package/lib/stores/view/grid/DataCubeGridClientExportEngine.js.map +1 -1
  121. package/lib/stores/view/grid/DataCubeGridMenuBuilder.d.ts +2 -0
  122. package/lib/stores/view/grid/DataCubeGridMenuBuilder.d.ts.map +1 -1
  123. package/lib/stores/view/grid/DataCubeGridMenuBuilder.js +9 -16
  124. package/lib/stores/view/grid/DataCubeGridMenuBuilder.js.map +1 -1
  125. package/lib/stores/view/grid/DataCubeGridState.d.ts +2 -2
  126. package/lib/stores/view/grid/DataCubeGridState.d.ts.map +1 -1
  127. package/lib/stores/view/grid/DataCubeGridState.js +19 -6
  128. package/lib/stores/view/grid/DataCubeGridState.js.map +1 -1
  129. package/package.json +5 -5
  130. package/src/components/DataCubePlaceholder.tsx +2 -0
  131. package/src/components/core/DataCubePureCodeEditorUtils.tsx +2 -1
  132. package/src/components/view/editor/DataCubeEditor.tsx +8 -3
  133. package/src/components/view/editor/DataCubeEditorColumnsPanel.tsx +6 -8
  134. package/src/components/view/editor/{DataCubeEditorColumnSelector.tsx → DataCubeEditorColumnsSelector.tsx} +108 -83
  135. package/src/components/view/editor/DataCubeEditorDimensionsPanel.tsx +1259 -503
  136. package/src/components/view/editor/DataCubeEditorHorizontalPivotsPanel.tsx +5 -5
  137. package/src/components/view/editor/DataCubeEditorSortsPanel.tsx +10 -10
  138. package/src/components/view/editor/DataCubeEditorVerticalPivotsPanel.tsx +2 -2
  139. package/src/components/view/extend/DataCubeCodeEditor.tsx +175 -0
  140. package/src/components/view/extend/DataCubeCodeEditorState.tsx +72 -0
  141. package/src/components/view/extend/DataCubeColumnEditor.tsx +5 -133
  142. package/src/components/view/grid/DataCubeGrid.tsx +70 -53
  143. package/src/components/view/grid/DataCubeMultidimensionalGrid.tsx +3 -1
  144. package/src/index.tsx +3 -0
  145. package/src/stores/DataCubeAPI.ts +3 -1
  146. package/src/stores/core/DataCubeEngine.tsx +1 -1
  147. package/src/stores/core/DataCubeQueryEngine.ts +6 -0
  148. package/src/stores/core/DataCubeSnapshot.ts +1 -1
  149. package/src/stores/core/model/AdhocQueryDataCubeSource.ts +3 -0
  150. package/src/stores/core/model/DataCubeConfiguration.ts +31 -0
  151. package/src/stores/services/DataCubeSettingService.tsx +10 -6
  152. package/src/stores/view/DataCubeInfoState.ts +4 -0
  153. package/src/stores/view/editor/DataCubeEditorColumnsPanelState.ts +13 -13
  154. package/src/stores/view/editor/{DataCubeEditorColumnSelectorState.ts → DataCubeEditorColumnsSelectorState.ts} +6 -6
  155. package/src/stores/view/editor/DataCubeEditorDimensionsPanelState.ts +162 -58
  156. package/src/stores/view/editor/DataCubeEditorHorizontalPivotsPanelState.ts +12 -11
  157. package/src/stores/view/editor/DataCubeEditorMutableConfiguration.ts +8 -0
  158. package/src/stores/view/editor/DataCubeEditorSortsPanelState.ts +10 -10
  159. package/src/stores/view/editor/DataCubeEditorState.tsx +6 -0
  160. package/src/stores/view/editor/DataCubeEditorVerticalPivotsPanelState.ts +11 -11
  161. package/src/stores/view/extend/DataCubeColumnEditorState.tsx +16 -26
  162. package/src/stores/view/grid/DataCubeGridClientEngine.ts +8 -0
  163. package/src/stores/view/grid/DataCubeGridClientExportEngine.ts +1 -1
  164. package/src/stores/view/grid/DataCubeGridMenuBuilder.tsx +26 -1
  165. package/src/stores/view/grid/DataCubeGridState.ts +23 -6
  166. package/tsconfig.json +4 -3
  167. package/lib/components/view/editor/DataCubeEditorColumnSelector.d.ts +0 -38
  168. package/lib/components/view/editor/DataCubeEditorColumnSelector.d.ts.map +0 -1
  169. package/lib/components/view/editor/DataCubeEditorColumnSelector.js.map +0 -1
  170. package/lib/components/view/grid/DataCubeGridShared.d.ts.map +0 -1
  171. package/lib/components/view/grid/DataCubeGridShared.js +0 -25
  172. package/lib/components/view/grid/DataCubeGridShared.js.map +0 -1
  173. package/lib/stores/view/editor/DataCubeEditorColumnSelectorState.d.ts.map +0 -1
  174. package/lib/stores/view/editor/DataCubeEditorColumnSelectorState.js.map +0 -1
  175. package/src/components/view/grid/DataCubeGridShared.tsx +0 -42
@@ -33,10 +33,10 @@ import {
33
33
  type CustomNoRowsOverlayProps,
34
34
  } from 'ag-grid-react';
35
35
  import {
36
- type DataCubeEditorSortColumnState,
37
- type DataCubeEditorColumnSelectorColumnState,
38
- type DataCubeEditorColumnSelectorState,
39
- } from '../../../stores/view/editor/DataCubeEditorColumnSelectorState.js';
36
+ type DataCubeEditorColumnsSelectorSortColumnState,
37
+ type DataCubeEditorColumnsSelectorColumnState,
38
+ type DataCubeEditorColumnsSelectorState,
39
+ } from '../../../stores/view/editor/DataCubeEditorColumnsSelectorState.js';
40
40
  import { isNonNullable } from '@finos/legend-shared';
41
41
  import {
42
42
  getDataForAllFilteredNodes,
@@ -47,12 +47,16 @@ import {
47
47
  FormDropdownMenuItem,
48
48
  } from '../../core/DataCubeFormUtils.js';
49
49
  import { DataCubeQuerySortDirection } from '../../../stores/core/DataCubeQueryEngine.js';
50
+ import { _findCol } from '../../../stores/core/model/DataCubeColumn.js';
50
51
 
51
- function getBaseGridProps<
52
- T extends DataCubeEditorColumnSelectorColumnState,
52
+ export const INTERNAL__EDITOR_COLUMNS_SELECTOR_ROW_HEIGHT = 20;
53
+
54
+ export function getColumnsSelectorBaseGridProps<
55
+ T extends { name: string } = DataCubeEditorColumnsSelectorColumnState,
53
56
  >(): AgGridReactProps<T> {
54
57
  return {
55
58
  modules: [AllCommunityModule],
59
+ theme: 'legacy',
56
60
  className: 'ag-theme-quartz',
57
61
  animateRows: false,
58
62
  getRowId: (params) => params.data.name,
@@ -67,8 +71,8 @@ function getBaseGridProps<
67
71
  },
68
72
  selectionColumnDef: {
69
73
  width: 40,
70
- headerClass: '!pl-[23px]',
71
- cellClass: '!pl-1.5',
74
+ headerClass: 'pl-6',
75
+ cellClass: 'pl-1.5',
72
76
  rowDrag: true,
73
77
  rowDragText: (params, dragItemCount) => {
74
78
  if (dragItemCount > 1) {
@@ -81,8 +85,8 @@ function getBaseGridProps<
81
85
  suppressHeaderMenuButton: true,
82
86
  },
83
87
  suppressMoveWhenRowDragging: true,
84
- rowHeight: 20,
85
- headerHeight: 20,
88
+ rowHeight: INTERNAL__EDITOR_COLUMNS_SELECTOR_ROW_HEIGHT,
89
+ headerHeight: INTERNAL__EDITOR_COLUMNS_SELECTOR_ROW_HEIGHT,
86
90
  suppressRowHoverHighlight: false,
87
91
  noRowsOverlayComponent: (
88
92
  params: CustomNoRowsOverlayProps<T> & {
@@ -116,8 +120,8 @@ function getBaseGridProps<
116
120
  };
117
121
  }
118
122
 
119
- function getBaseColumnDef<
120
- T extends DataCubeEditorColumnSelectorColumnState,
123
+ export function getColumnsSelectorBaseColumnDef<
124
+ T extends { name: string } = DataCubeEditorColumnsSelectorColumnState,
121
125
  >(): ColDef<T> {
122
126
  return {
123
127
  field: 'name' as ColDefField<T>,
@@ -137,9 +141,10 @@ function getBaseColumnDef<
137
141
  */
138
142
  const ColumnsSearchResultCountBadge = observer(
139
143
  function ColumnsSearchResultCountBadge<
140
- T extends DataCubeEditorColumnSelectorColumnState,
144
+ T extends
145
+ DataCubeEditorColumnsSelectorColumnState = DataCubeEditorColumnsSelectorColumnState,
141
146
  >(props: {
142
- selector: DataCubeEditorColumnSelectorState<T>;
147
+ selector: DataCubeEditorColumnsSelectorState<T>;
143
148
  gridApi: GridApi<T>;
144
149
  scope: 'available' | 'selected';
145
150
  }) {
@@ -158,20 +163,21 @@ const ColumnsSearchResultCountBadge = observer(
158
163
  },
159
164
  );
160
165
 
161
- export const DataCubeEditorColumnSelector = observer(
162
- function DataCubeEditorColumnSelector<
163
- T extends DataCubeEditorColumnSelectorColumnState,
166
+ export const DataCubeEditorColumnsSelector = observer(
167
+ function DataCubeEditorColumnsSelector<
168
+ T extends
169
+ DataCubeEditorColumnsSelectorColumnState = DataCubeEditorColumnsSelectorColumnState,
164
170
  >(props: {
165
- selector: DataCubeEditorColumnSelectorState<T>;
171
+ selector: DataCubeEditorColumnsSelectorState<T>;
166
172
  columnLabelRenderer?:
167
173
  | ((p: {
168
- selector: DataCubeEditorColumnSelectorState<T>;
174
+ selector: DataCubeEditorColumnsSelectorState<T>;
169
175
  column: T;
170
176
  }) => React.ReactNode)
171
177
  | undefined;
172
178
  columnActionRenderer?:
173
179
  | ((p: {
174
- selector: DataCubeEditorColumnSelectorState<T>;
180
+ selector: DataCubeEditorColumnsSelectorState<T>;
175
181
  column: T;
176
182
  }) => React.ReactNode)
177
183
  | undefined;
@@ -198,6 +204,24 @@ export const DataCubeEditorColumnSelector = observer(
198
204
  );
199
205
  const searchSelectedColumnsInputRef = useRef<HTMLInputElement | null>(null);
200
206
 
207
+ const onAvailableColumnsDragStop = useCallback(
208
+ (params: RowDragEndEvent<T>) => {
209
+ // NOTE: here, we do not scope the columns being moved by the search
210
+ // this is a complicated behavior to implement and it's not clear if
211
+ // it's necessary, the current behavior is sensible in its own way.
212
+ const columnsToMove = params.nodes
213
+ .map((node) => node.data)
214
+ .filter(isNonNullable);
215
+
216
+ selector.setSelectedColumns(
217
+ selector.selectedColumns.filter(
218
+ (column) => !_findCol(columnsToMove, column.name),
219
+ ),
220
+ );
221
+ },
222
+ [selector],
223
+ );
224
+
201
225
  /**
202
226
  * Since we use managed row dragging for selected columns,
203
227
  * we just need to sync the row data with the state.
@@ -211,21 +235,6 @@ export const DataCubeEditorColumnSelector = observer(
211
235
  [selector],
212
236
  );
213
237
 
214
- const onAvailableColumnsDragStop = useCallback(
215
- (params: RowDragEndEvent<T>) => {
216
- const nodes = params.nodes;
217
- const columnsToMove = nodes
218
- .map((node) => node.data)
219
- .filter(isNonNullable);
220
- selector.setSelectedColumns(
221
- selector.selectedColumns.filter(
222
- (column) => !columnsToMove.includes(column),
223
- ),
224
- );
225
- },
226
- [selector],
227
- );
228
-
229
238
  /**
230
239
  * Since we use managed row dragging for selected columns,
231
240
  * we just need to sync the row data with the state
@@ -233,6 +242,8 @@ export const DataCubeEditorColumnSelector = observer(
233
242
  * handled by ag-grid.
234
243
  */
235
244
  const onSelectedColumnsDragEnd = useCallback(
245
+ // this event hook is mainly meant for reordering columns within
246
+ // selected columns table
236
247
  (event: RowDragEndEvent) => {
237
248
  if (event.overIndex === -1) {
238
249
  return;
@@ -243,38 +254,43 @@ export const DataCubeEditorColumnSelector = observer(
243
254
  );
244
255
 
245
256
  /**
246
- * Setup row drop zones for each grid to be the other
257
+ * Setup drop zones for each grid to allow moving columns between them
247
258
  * See https://www.ag-grid.com/react-data-grid/row-dragging-to-grid/
248
259
  */
249
260
  useEffect(() => {
250
261
  if (!availableColumnsGridApi || !selectedColumnsGridApi) {
251
262
  return;
252
263
  }
264
+
253
265
  const selectedColumnsDropZoneParams =
254
- selectedColumnsGridApi.getRowDropZoneParams({
255
- onDragStop: (event) => {
256
- onSelectedColumnsDragStop(event);
257
- availableColumnsGridApi.clearFocusedCell();
258
- },
259
- });
260
- if (selectedColumnsDropZoneParams) {
261
- availableColumnsGridApi.removeRowDropZone(
262
- selectedColumnsDropZoneParams,
263
- );
266
+ !selectedColumnsGridApi.isDestroyed()
267
+ ? selectedColumnsGridApi.getRowDropZoneParams({
268
+ onDragStop: (event) => {
269
+ onSelectedColumnsDragStop(event);
270
+ availableColumnsGridApi.clearFocusedCell();
271
+ },
272
+ })
273
+ : undefined;
274
+ if (
275
+ selectedColumnsDropZoneParams &&
276
+ !availableColumnsGridApi.isDestroyed()
277
+ ) {
264
278
  availableColumnsGridApi.addRowDropZone(selectedColumnsDropZoneParams);
265
279
  }
266
280
 
267
281
  const availableColumnsDropZoneParams =
268
- availableColumnsGridApi.getRowDropZoneParams({
269
- onDragStop: (event) => {
270
- onAvailableColumnsDragStop(event);
271
- selectedColumnsGridApi.clearFocusedCell();
272
- },
273
- });
274
- if (availableColumnsDropZoneParams) {
275
- selectedColumnsGridApi.removeRowDropZone(
276
- availableColumnsDropZoneParams,
277
- );
282
+ !availableColumnsGridApi.isDestroyed()
283
+ ? availableColumnsGridApi.getRowDropZoneParams({
284
+ onDragStop: (event) => {
285
+ onAvailableColumnsDragStop(event);
286
+ selectedColumnsGridApi.clearFocusedCell();
287
+ },
288
+ })
289
+ : undefined;
290
+ if (
291
+ availableColumnsDropZoneParams &&
292
+ !selectedColumnsGridApi.isDestroyed()
293
+ ) {
278
294
  selectedColumnsGridApi.addRowDropZone(availableColumnsDropZoneParams);
279
295
  }
280
296
  }, [
@@ -295,7 +311,7 @@ export const DataCubeEditorColumnSelector = observer(
295
311
  <input
296
312
  className="h-full w-full pl-10 pr-6 placeholder-neutral-400"
297
313
  ref={searchAvailableColumnsInputRef}
298
- placeholder="Click here to search..."
314
+ placeholder="Search columns..."
299
315
  value={selector.availableColumnsSearchText}
300
316
  onChange={(event) =>
301
317
  selector.setAvailableColumnsSearchText(event.target.value)
@@ -325,8 +341,7 @@ export const DataCubeEditorColumnSelector = observer(
325
341
  </div>
326
342
  <div className="h-[calc(100%_-_24px)]">
327
343
  <AgGridReact
328
- theme="legacy"
329
- {...getBaseGridProps<T>()}
344
+ {...getColumnsSelectorBaseGridProps<T>()}
330
345
  // Disable managed row-dragging to disallow changing the order of columns
331
346
  // and to make sure the row data and the available columns state are in sync
332
347
  rowDragManaged={false}
@@ -344,7 +359,7 @@ export const DataCubeEditorColumnSelector = observer(
344
359
  rowData={selector.availableColumnsForDisplay}
345
360
  columnDefs={[
346
361
  {
347
- ...getBaseColumnDef<T>(),
362
+ ...getColumnsSelectorBaseColumnDef<T>(),
348
363
  /**
349
364
  * Support double-click to add all (filtered by search) columns
350
365
  */
@@ -354,12 +369,12 @@ export const DataCubeEditorColumnSelector = observer(
354
369
  className="flex h-full w-full items-center justify-between pl-0.5"
355
370
  onDoubleClick={() => {
356
371
  // The columns being moved are scoped by the current search
357
- const filteredData = getDataForAllFilteredNodes(
372
+ const filteredNodes = getDataForAllFilteredNodes(
358
373
  params.api,
359
374
  );
360
375
  selector.setSelectedColumns([
361
376
  ...selector.selectedColumns,
362
- ...filteredData,
377
+ ...filteredNodes,
363
378
  ]);
364
379
  params.api.clearFocusedCell();
365
380
  }}
@@ -417,21 +432,24 @@ export const DataCubeEditorColumnSelector = observer(
417
432
  <div className="flex flex-col">
418
433
  <button
419
434
  className="flex items-center justify-center rounded-sm border border-neutral-300 bg-neutral-100 text-neutral-500 hover:bg-neutral-200 disabled:bg-neutral-200 disabled:text-neutral-400"
420
- title="Add selected columns"
435
+ title="Add selected column(s)"
421
436
  /**
422
437
  * Support add selected (filtered by search) columns
423
438
  * We reset the selection after this operation
424
439
  */
425
440
  onClick={() => {
426
- if (!availableColumnsGridApi) {
441
+ if (
442
+ !availableColumnsGridApi ||
443
+ selectedAvailableColumns.length === 0
444
+ ) {
427
445
  return;
428
446
  }
429
447
  // The columns being moved are scoped by the current search
430
- const filteredData = getDataForAllFilteredNodes(
448
+ const filteredNodes = getDataForAllFilteredNodes(
431
449
  availableColumnsGridApi,
432
450
  );
433
451
  const columnsToMove = selectedAvailableColumns.filter(
434
- (column) => filteredData.includes(column),
452
+ (column) => _findCol(filteredNodes, column.name),
435
453
  );
436
454
  selector.setSelectedColumns([
437
455
  ...selector.selectedColumns,
@@ -439,36 +457,44 @@ export const DataCubeEditorColumnSelector = observer(
439
457
  ]);
440
458
  availableColumnsGridApi.clearFocusedCell();
441
459
  }}
442
- disabled={selectedAvailableColumns.length === 0}
460
+ disabled={
461
+ !availableColumnsGridApi ||
462
+ selectedAvailableColumns.length === 0
463
+ }
443
464
  >
444
465
  <DataCubeIcon.ChevronRight className="text-2xl" />
445
466
  </button>
446
467
  <button
447
468
  className="mt-2 flex items-center justify-center rounded-sm border border-neutral-300 bg-neutral-100 text-neutral-500 hover:bg-neutral-200 disabled:bg-neutral-200 disabled:text-neutral-400"
448
- title="Remove selected columns"
469
+ title="Remove selected column(s)"
449
470
  /**
450
471
  * Support remove selected (filtered by search) columns
451
472
  * We reset the selection after this operation
452
473
  */
453
474
  onClick={() => {
454
- if (!selectedColumnsGridApi) {
475
+ if (
476
+ !selectedColumnsGridApi ||
477
+ selectedSelectedColumns.length === 0
478
+ ) {
455
479
  return;
456
480
  }
457
481
  // The columns being moved are scoped by the current search
458
- const filteredData = getDataForAllFilteredNodes(
482
+ const filteredNodes = getDataForAllFilteredNodes(
459
483
  selectedColumnsGridApi,
460
484
  );
461
485
  const columnsToMove = selectedSelectedColumns.filter((column) =>
462
- filteredData.includes(column),
486
+ _findCol(filteredNodes, column.name),
463
487
  );
464
488
  selector.setSelectedColumns(
465
489
  selector.selectedColumns.filter(
466
- (column) => !columnsToMove.includes(column),
490
+ (column) => !_findCol(columnsToMove, column.name),
467
491
  ),
468
492
  );
469
493
  selectedColumnsGridApi.clearFocusedCell();
470
494
  }}
471
- disabled={selectedSelectedColumns.length === 0}
495
+ disabled={
496
+ !selectedColumnsGridApi || selectedSelectedColumns.length === 0
497
+ }
472
498
  >
473
499
  <DataCubeIcon.ChevronLeft className="text-2xl" />
474
500
  </button>
@@ -481,7 +507,7 @@ export const DataCubeEditorColumnSelector = observer(
481
507
  <input
482
508
  className="h-full w-full pl-10 placeholder-neutral-400"
483
509
  ref={searchSelectedColumnsInputRef}
484
- placeholder="Click here to search..."
510
+ placeholder="Search columns..."
485
511
  value={selector.selectedColumnsSearchText}
486
512
  onChange={(event) =>
487
513
  selector.setSelectedColumnsSearchText(event.target.value)
@@ -510,8 +536,7 @@ export const DataCubeEditorColumnSelector = observer(
510
536
  </div>
511
537
  <div className="h-[calc(100%_-_24px)]">
512
538
  <AgGridReact
513
- theme="legacy"
514
- {...getBaseGridProps<T>()}
539
+ {...getColumnsSelectorBaseGridProps<T>()}
515
540
  // NOTE: technically, we don't want to enable managed row-dragging here
516
541
  // but enabling this gives us free row moving management and interaction
517
542
  // comes out of the box from ag-grid, we will just sync the state with
@@ -535,7 +560,7 @@ export const DataCubeEditorColumnSelector = observer(
535
560
  rowData={selector.selectedColumnsForDisplay}
536
561
  columnDefs={[
537
562
  {
538
- ...getBaseColumnDef<T>(),
563
+ ...getColumnsSelectorBaseColumnDef<T>(),
539
564
  /**
540
565
  * Support double-click to remove all (filtered by search) columns
541
566
  */
@@ -545,12 +570,12 @@ export const DataCubeEditorColumnSelector = observer(
545
570
  className="flex h-full w-full items-center justify-between pl-0.5"
546
571
  onDoubleClick={() => {
547
572
  // The columns being moved are scoped by the current search
548
- const filteredData = getDataForAllFilteredNodes(
573
+ const filteredNodes = getDataForAllFilteredNodes(
549
574
  params.api,
550
575
  );
551
576
  selector.setSelectedColumns(
552
577
  selector.selectedColumns.filter(
553
- (column) => !filteredData.includes(column),
578
+ (column) => !_findCol(filteredNodes, column.name),
554
579
  ),
555
580
  );
556
581
  params.api.clearFocusedCell();
@@ -573,7 +598,7 @@ export const DataCubeEditorColumnSelector = observer(
573
598
  return (
574
599
  <div
575
600
  className="flex h-full w-full cursor-pointer items-center"
576
- title={`[${data.name}]\nDouble-click to add column`}
601
+ title={`[${data.name}]\nDouble-click to remove column`}
577
602
  onDoubleClick={() => {
578
603
  selector.setSelectedColumns(
579
604
  selector.selectedColumns.filter(
@@ -611,10 +636,10 @@ export const DataCubeEditorColumnSelector = observer(
611
636
  },
612
637
  );
613
638
 
614
- export const DataCubeColumnSelectorSortDirectionDropdown = observer(
639
+ export const DataCubeEditorColumnsSelectorSortDirectionDropdown = observer(
615
640
  (props: {
616
- selector: DataCubeEditorColumnSelectorState<DataCubeEditorSortColumnState>;
617
- column: DataCubeEditorSortColumnState;
641
+ selector: DataCubeEditorColumnsSelectorState<DataCubeEditorColumnsSelectorSortColumnState>;
642
+ column: DataCubeEditorColumnsSelectorSortColumnState;
618
643
  }) => {
619
644
  const { column } = props;
620
645
  const [