@finos/legend-application-repl 0.0.58 → 0.0.60

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 (136) hide show
  1. package/lib/components/dataCube/editor/DataCubeEditorColumnPropertiesPanel.d.ts.map +1 -1
  2. package/lib/components/dataCube/editor/DataCubeEditorColumnPropertiesPanel.js +3 -19
  3. package/lib/components/dataCube/editor/DataCubeEditorColumnPropertiesPanel.js.map +1 -1
  4. package/lib/components/dataCube/editor/DataCubeEditorColumnsPanel.d.ts.map +1 -1
  5. package/lib/components/dataCube/editor/DataCubeEditorColumnsPanel.js +5 -7
  6. package/lib/components/dataCube/editor/DataCubeEditorColumnsPanel.js.map +1 -1
  7. package/lib/components/dataCube/editor/DataCubeEditorColumnsSelector.d.ts.map +1 -1
  8. package/lib/components/dataCube/editor/DataCubeEditorColumnsSelector.js +22 -12
  9. package/lib/components/dataCube/editor/DataCubeEditorColumnsSelector.js.map +1 -1
  10. package/lib/components/dataCube/editor/DataCubeEditorGeneralPropertiesPanel.d.ts.map +1 -1
  11. package/lib/components/dataCube/editor/DataCubeEditorGeneralPropertiesPanel.js +1 -1
  12. package/lib/components/dataCube/editor/DataCubeEditorGeneralPropertiesPanel.js.map +1 -1
  13. package/lib/components/dataCube/editor/DataCubeEditorSortsPanel.d.ts.map +1 -1
  14. package/lib/components/dataCube/editor/DataCubeEditorSortsPanel.js +6 -2
  15. package/lib/components/dataCube/editor/DataCubeEditorSortsPanel.js.map +1 -1
  16. package/lib/components/repl/Form.d.ts.map +1 -1
  17. package/lib/components/repl/Form.js +3 -2
  18. package/lib/components/repl/Form.js.map +1 -1
  19. package/lib/components/repl/PureCodeEditor.js +1 -1
  20. package/lib/components/repl/PureCodeEditor.js.map +1 -1
  21. package/lib/components/repl/SettingsPanel.d.ts.map +1 -1
  22. package/lib/components/repl/SettingsPanel.js +11 -8
  23. package/lib/components/repl/SettingsPanel.js.map +1 -1
  24. package/lib/index.css +2 -2
  25. package/lib/index.css.map +1 -1
  26. package/lib/package.json +1 -1
  27. package/lib/stores/dataCube/DataCubeEngine.d.ts +11 -8
  28. package/lib/stores/dataCube/DataCubeEngine.d.ts.map +1 -1
  29. package/lib/stores/dataCube/DataCubeEngine.js +24 -17
  30. package/lib/stores/dataCube/DataCubeEngine.js.map +1 -1
  31. package/lib/stores/dataCube/core/DataCubeConfiguration.d.ts +12 -1
  32. package/lib/stores/dataCube/core/DataCubeConfiguration.d.ts.map +1 -1
  33. package/lib/stores/dataCube/core/DataCubeConfiguration.js +13 -1
  34. package/lib/stores/dataCube/core/DataCubeConfiguration.js.map +1 -1
  35. package/lib/stores/dataCube/core/DataCubeQueryBuilder.d.ts.map +1 -1
  36. package/lib/stores/dataCube/core/DataCubeQueryBuilder.js +3 -6
  37. package/lib/stores/dataCube/core/DataCubeQueryBuilder.js.map +1 -1
  38. package/lib/stores/dataCube/core/DataCubeQueryBuilderUtils.d.ts +3 -1
  39. package/lib/stores/dataCube/core/DataCubeQueryBuilderUtils.d.ts.map +1 -1
  40. package/lib/stores/dataCube/core/DataCubeQueryBuilderUtils.js +25 -7
  41. package/lib/stores/dataCube/core/DataCubeQueryBuilderUtils.js.map +1 -1
  42. package/lib/stores/dataCube/core/DataCubeQueryEngine.d.ts +2 -0
  43. package/lib/stores/dataCube/core/DataCubeQueryEngine.d.ts.map +1 -1
  44. package/lib/stores/dataCube/core/DataCubeQueryEngine.js +12 -1
  45. package/lib/stores/dataCube/core/DataCubeQueryEngine.js.map +1 -1
  46. package/lib/stores/dataCube/core/DataCubeQuerySnapshot.d.ts +5 -8
  47. package/lib/stores/dataCube/core/DataCubeQuerySnapshot.d.ts.map +1 -1
  48. package/lib/stores/dataCube/core/DataCubeQuerySnapshot.js +3 -32
  49. package/lib/stores/dataCube/core/DataCubeQuerySnapshot.js.map +1 -1
  50. package/lib/stores/dataCube/core/DataCubeQuerySnapshotBuilder.d.ts.map +1 -1
  51. package/lib/stores/dataCube/core/DataCubeQuerySnapshotBuilder.js +8 -10
  52. package/lib/stores/dataCube/core/DataCubeQuerySnapshotBuilder.js.map +1 -1
  53. package/lib/stores/dataCube/editor/DataCubeEditorColumnPropertiesPanelState.d.ts +1 -3
  54. package/lib/stores/dataCube/editor/DataCubeEditorColumnPropertiesPanelState.d.ts.map +1 -1
  55. package/lib/stores/dataCube/editor/DataCubeEditorColumnPropertiesPanelState.js +5 -32
  56. package/lib/stores/dataCube/editor/DataCubeEditorColumnPropertiesPanelState.js.map +1 -1
  57. package/lib/stores/dataCube/editor/DataCubeEditorColumnsPanelState.d.ts +8 -19
  58. package/lib/stores/dataCube/editor/DataCubeEditorColumnsPanelState.d.ts.map +1 -1
  59. package/lib/stores/dataCube/editor/DataCubeEditorColumnsPanelState.js +44 -105
  60. package/lib/stores/dataCube/editor/DataCubeEditorColumnsPanelState.js.map +1 -1
  61. package/lib/stores/dataCube/editor/DataCubeEditorGeneralPropertiesPanelState.js +2 -2
  62. package/lib/stores/dataCube/editor/DataCubeEditorGeneralPropertiesPanelState.js.map +1 -1
  63. package/lib/stores/dataCube/editor/DataCubeEditorHorizontalPivotsPanelState.d.ts +4 -1
  64. package/lib/stores/dataCube/editor/DataCubeEditorHorizontalPivotsPanelState.d.ts.map +1 -1
  65. package/lib/stores/dataCube/editor/DataCubeEditorHorizontalPivotsPanelState.js +19 -22
  66. package/lib/stores/dataCube/editor/DataCubeEditorHorizontalPivotsPanelState.js.map +1 -1
  67. package/lib/stores/dataCube/editor/DataCubeEditorMutableConfiguration.d.ts +2 -1
  68. package/lib/stores/dataCube/editor/DataCubeEditorMutableConfiguration.d.ts.map +1 -1
  69. package/lib/stores/dataCube/editor/DataCubeEditorMutableConfiguration.js +9 -4
  70. package/lib/stores/dataCube/editor/DataCubeEditorMutableConfiguration.js.map +1 -1
  71. package/lib/stores/dataCube/editor/DataCubeEditorSortsPanelState.d.ts.map +1 -1
  72. package/lib/stores/dataCube/editor/DataCubeEditorSortsPanelState.js +9 -5
  73. package/lib/stores/dataCube/editor/DataCubeEditorSortsPanelState.js.map +1 -1
  74. package/lib/stores/dataCube/editor/DataCubeEditorState.d.ts +5 -2
  75. package/lib/stores/dataCube/editor/DataCubeEditorState.d.ts.map +1 -1
  76. package/lib/stores/dataCube/editor/DataCubeEditorState.js +60 -56
  77. package/lib/stores/dataCube/editor/DataCubeEditorState.js.map +1 -1
  78. package/lib/stores/dataCube/editor/DataCubeEditorVerticalPivotsPanelState.d.ts.map +1 -1
  79. package/lib/stores/dataCube/editor/DataCubeEditorVerticalPivotsPanelState.js +9 -11
  80. package/lib/stores/dataCube/editor/DataCubeEditorVerticalPivotsPanelState.js.map +1 -1
  81. package/lib/stores/dataCube/extend/DataCubeExtendManagerState.d.ts +2 -1
  82. package/lib/stores/dataCube/extend/DataCubeExtendManagerState.d.ts.map +1 -1
  83. package/lib/stores/dataCube/extend/DataCubeExtendManagerState.js +7 -9
  84. package/lib/stores/dataCube/extend/DataCubeExtendManagerState.js.map +1 -1
  85. package/lib/stores/dataCube/grid/DataCubeGridClientEngine.d.ts.map +1 -1
  86. package/lib/stores/dataCube/grid/DataCubeGridClientEngine.js +20 -2
  87. package/lib/stores/dataCube/grid/DataCubeGridClientEngine.js.map +1 -1
  88. package/lib/stores/dataCube/grid/DataCubeGridConfigurationBuilder.d.ts +13 -13
  89. package/lib/stores/dataCube/grid/DataCubeGridConfigurationBuilder.d.ts.map +1 -1
  90. package/lib/stores/dataCube/grid/DataCubeGridConfigurationBuilder.js +78 -67
  91. package/lib/stores/dataCube/grid/DataCubeGridConfigurationBuilder.js.map +1 -1
  92. package/lib/stores/dataCube/grid/DataCubeGridControllerState.d.ts +16 -14
  93. package/lib/stores/dataCube/grid/DataCubeGridControllerState.d.ts.map +1 -1
  94. package/lib/stores/dataCube/grid/DataCubeGridControllerState.js +78 -49
  95. package/lib/stores/dataCube/grid/DataCubeGridControllerState.js.map +1 -1
  96. package/lib/stores/dataCube/grid/DataCubeGridMenuBuilder.d.ts.map +1 -1
  97. package/lib/stores/dataCube/grid/DataCubeGridMenuBuilder.js +65 -18
  98. package/lib/stores/dataCube/grid/DataCubeGridMenuBuilder.js.map +1 -1
  99. package/lib/stores/dataCube/grid/DataCubeGridQueryBuilder.d.ts.map +1 -1
  100. package/lib/stores/dataCube/grid/DataCubeGridQueryBuilder.js +2 -8
  101. package/lib/stores/dataCube/grid/DataCubeGridQueryBuilder.js.map +1 -1
  102. package/lib/stores/dataCube/grid/DataCubeGridQuerySnapshotBuilder.d.ts +2 -0
  103. package/lib/stores/dataCube/grid/DataCubeGridQuerySnapshotBuilder.d.ts.map +1 -1
  104. package/lib/stores/dataCube/grid/DataCubeGridQuerySnapshotBuilder.js +12 -5
  105. package/lib/stores/dataCube/grid/DataCubeGridQuerySnapshotBuilder.js.map +1 -1
  106. package/package.json +4 -4
  107. package/src/components/dataCube/editor/DataCubeEditorColumnPropertiesPanel.tsx +10 -32
  108. package/src/components/dataCube/editor/DataCubeEditorColumnsPanel.tsx +9 -11
  109. package/src/components/dataCube/editor/DataCubeEditorColumnsSelector.tsx +22 -12
  110. package/src/components/dataCube/editor/DataCubeEditorGeneralPropertiesPanel.tsx +1 -3
  111. package/src/components/dataCube/editor/DataCubeEditorSortsPanel.tsx +20 -1
  112. package/src/components/repl/Form.tsx +3 -2
  113. package/src/components/repl/PureCodeEditor.tsx +1 -1
  114. package/src/components/repl/SettingsPanel.tsx +37 -12
  115. package/src/stores/dataCube/DataCubeEngine.ts +28 -17
  116. package/src/stores/dataCube/core/DataCubeConfiguration.ts +13 -1
  117. package/src/stores/dataCube/core/DataCubeQueryBuilder.ts +3 -8
  118. package/src/stores/dataCube/core/DataCubeQueryBuilderUtils.ts +34 -8
  119. package/src/stores/dataCube/core/DataCubeQueryEngine.ts +17 -1
  120. package/src/stores/dataCube/core/DataCubeQuerySnapshot.ts +6 -49
  121. package/src/stores/dataCube/core/DataCubeQuerySnapshotBuilder.ts +8 -9
  122. package/src/stores/dataCube/editor/DataCubeEditorColumnPropertiesPanelState.ts +8 -46
  123. package/src/stores/dataCube/editor/DataCubeEditorColumnsPanelState.ts +60 -141
  124. package/src/stores/dataCube/editor/DataCubeEditorGeneralPropertiesPanelState.ts +2 -2
  125. package/src/stores/dataCube/editor/DataCubeEditorHorizontalPivotsPanelState.ts +34 -35
  126. package/src/stores/dataCube/editor/DataCubeEditorMutableConfiguration.ts +11 -4
  127. package/src/stores/dataCube/editor/DataCubeEditorSortsPanelState.ts +18 -13
  128. package/src/stores/dataCube/editor/DataCubeEditorState.tsx +88 -79
  129. package/src/stores/dataCube/editor/DataCubeEditorVerticalPivotsPanelState.ts +16 -12
  130. package/src/stores/dataCube/extend/DataCubeExtendManagerState.tsx +17 -19
  131. package/src/stores/dataCube/grid/DataCubeGridClientEngine.ts +22 -2
  132. package/src/stores/dataCube/grid/DataCubeGridConfigurationBuilder.tsx +113 -76
  133. package/src/stores/dataCube/grid/DataCubeGridControllerState.ts +134 -95
  134. package/src/stores/dataCube/grid/DataCubeGridMenuBuilder.tsx +80 -24
  135. package/src/stores/dataCube/grid/DataCubeGridQueryBuilder.ts +2 -7
  136. package/src/stores/dataCube/grid/DataCubeGridQuerySnapshotBuilder.ts +30 -5
@@ -55,11 +55,11 @@ import {
55
55
  INTERNAL__GRID_CLIENT_DATA_FETCH_MANUAL_TRIGGER_COLUMN_ID,
56
56
  INTERNAL__GRID_CLIENT_PIVOT_COLUMN_GROUP_COLOR_ROTATION_SIZE,
57
57
  } from './DataCubeGridClientEngine.js';
58
- import { PRIMITIVE_TYPE } from '@finos/legend-graph';
59
58
  import {
60
59
  getNonNullableEntry,
61
60
  getQueryParameters,
62
61
  getQueryParameterValue,
62
+ guaranteeNonNullable,
63
63
  isNonNullable,
64
64
  isNullable,
65
65
  isNumber,
@@ -80,6 +80,7 @@ import {
80
80
  DataCubeColumnKind,
81
81
  DEFAULT_MISSING_VALUE_DISPLAY_TEXT,
82
82
  PIVOT_COLUMN_NAME_VALUE_SEPARATOR,
83
+ isPivotResultColumnName,
83
84
  } from '../core/DataCubeQueryEngine.js';
84
85
  import type { CustomLoadingCellRendererProps } from '@ag-grid-community/react';
85
86
  import { DataCubeIcon } from '@finos/legend-art';
@@ -87,24 +88,6 @@ import type { DataCubeState } from '../DataCubeState.js';
87
88
 
88
89
  // --------------------------------- UTILITIES ---------------------------------
89
90
 
90
- // See https://www.ag-grid.com/react-data-grid/cell-data-types/
91
- function _cellDataType(column: DataCubeQuerySnapshotColumn) {
92
- switch (column.type) {
93
- case PRIMITIVE_TYPE.NUMBER:
94
- case PRIMITIVE_TYPE.DECIMAL:
95
- case PRIMITIVE_TYPE.INTEGER:
96
- case PRIMITIVE_TYPE.FLOAT:
97
- return 'number';
98
- case PRIMITIVE_TYPE.DATE:
99
- case PRIMITIVE_TYPE.DATETIME:
100
- case PRIMITIVE_TYPE.STRICTDATE:
101
- return 'dateString';
102
- case PRIMITIVE_TYPE.STRING:
103
- default:
104
- return 'text';
105
- }
106
- }
107
-
108
91
  function scaleNumber(
109
92
  value: number,
110
93
  type: DataCubeNumberScale | undefined,
@@ -157,6 +140,7 @@ function DataCubeGridLoadingCellRenderer(
157
140
  // --------------------------------- BUILDING BLOCKS ---------------------------------
158
141
 
159
142
  type ColumnData = {
143
+ name: string;
160
144
  snapshot: DataCubeQuerySnapshot;
161
145
  column: DataCubeColumnConfiguration;
162
146
  configuration: DataCubeConfiguration;
@@ -192,7 +176,7 @@ function getCellRenderer(columnData: ColumnData) {
192
176
  }
193
177
 
194
178
  function _displaySpec(columnData: ColumnData) {
195
- const { column, configuration } = columnData;
179
+ const { name, snapshot, column, configuration } = columnData;
196
180
  const dataType = getDataType(column.type);
197
181
  const fontFamily = column.fontFamily ?? configuration.fontFamily;
198
182
  const fontSize = column.fontSize ?? configuration.fontSize;
@@ -221,10 +205,18 @@ function _displaySpec(columnData: ColumnData) {
221
205
  column.errorBackgroundColor ?? configuration.errorBackgroundColor;
222
206
  const cellRenderer = getCellRenderer(columnData);
223
207
  return {
224
- // setting the cell data type might helps guide the grid to render the cell properly
225
- // and optimize the grid performance slightly by avoiding unnecessary type inference
226
- cellDataType: _cellDataType(column),
227
- hide: column.hideFromView,
208
+ // disabling cell data type inference can grid performance
209
+ // especially when this information is only necessary for cell value editor
210
+ cellDataType: false,
211
+ hide:
212
+ column.hideFromView ||
213
+ !column.isSelected ||
214
+ (snapshot.data.pivot &&
215
+ !snapshot.data.pivot.castColumns.find((col) => col.name === name)),
216
+ lockVisible:
217
+ !column.isSelected ||
218
+ (snapshot.data.pivot &&
219
+ !snapshot.data.pivot.castColumns.find((col) => col.name === name)),
228
220
  valueFormatter:
229
221
  dataType === DataCubeColumnDataType.NUMBER
230
222
  ? (params) => {
@@ -271,6 +263,9 @@ function _displaySpec(columnData: ColumnData) {
271
263
  DEFAULT_MISSING_VALUE_DISPLAY_TEXT)
272
264
  : params.value,
273
265
  loadingCellRenderer: DataCubeGridLoadingCellRenderer,
266
+ headerClass: isPivotResultColumnName(name)
267
+ ? 'pl-1 border border-neutral-300'
268
+ : 'pl-1 border border-neutral-200',
274
269
  cellClassRules: {
275
270
  [generateFontFamilyUtilityClassName(fontFamily)]: () => true,
276
271
  [generateFontSizeUtilityClassName(fontSize)]: () => true,
@@ -365,9 +360,9 @@ function _sizeSpec(columnData: ColumnData) {
365
360
  }
366
361
 
367
362
  function _sortSpec(columnData: ColumnData) {
368
- const { snapshot, column } = columnData;
363
+ const { name, snapshot } = columnData;
369
364
  const sortColumns = snapshot.data.sortColumns;
370
- const sortCol = _findCol(sortColumns, column.name);
365
+ const sortCol = _findCol(sortColumns, name);
371
366
  return {
372
367
  sortable: true, // if this is pivot column, no sorting is supported yet
373
368
  sort: sortCol
@@ -380,18 +375,15 @@ function _sortSpec(columnData: ColumnData) {
380
375
  }
381
376
 
382
377
  function _aggSpec(columnData: ColumnData) {
383
- const { snapshot, column } = columnData;
378
+ const { name, snapshot, column } = columnData;
384
379
  const data = snapshot.data;
385
- const groupByCol = _findCol(data.groupBy?.columns, column.name);
386
- const pivotCol = _findCol(data.pivot?.columns, column.name);
380
+ const groupByCol = _findCol(data.groupBy?.columns, name);
387
381
  const isGroupExtendedColumn = Boolean(
388
- _findCol(data.groupExtendedColumns, column.name),
382
+ _findCol(data.groupExtendedColumns, name),
389
383
  );
390
384
  return {
391
385
  enableRowGroup:
392
386
  !isGroupExtendedColumn && column.kind === DataCubeColumnKind.DIMENSION,
393
- enablePivot:
394
- !isGroupExtendedColumn && column.kind === DataCubeColumnKind.DIMENSION,
395
387
  rowGroup: !isGroupExtendedColumn && Boolean(groupByCol),
396
388
  rowGroupIndex:
397
389
  !isGroupExtendedColumn && groupByCol
@@ -405,11 +397,6 @@ function _aggSpec(columnData: ColumnData) {
405
397
  aggFunc: !isGroupExtendedColumn ? column.aggregateOperator : null,
406
398
  enableValue: false, // disable GUI interactions to modify this column's aggregate function
407
399
  allowedAggFuncs: [], // disable GUI for options of the agg functions
408
- pivot: !isGroupExtendedColumn && Boolean(pivotCol),
409
- pivotIndex:
410
- !isGroupExtendedColumn && groupByCol
411
- ? (data.groupBy?.columns.indexOf(groupByCol) ?? null)
412
- : null,
413
400
  } satisfies ColDef;
414
401
  }
415
402
 
@@ -446,7 +433,6 @@ export function generateBaseGridOptions(dataCube: DataCubeState): GridOptions {
446
433
  // -------------------------------------- DISPLAY --------------------------------------
447
434
  rowHeight: INTERNAL__GRID_CLIENT_ROW_HEIGHT,
448
435
  headerHeight: INTERNAL__GRID_CLIENT_HEADER_HEIGHT,
449
- suppressBrowserResizeObserver: true,
450
436
  noRowsOverlayComponent: () => (
451
437
  <div className="flex items-center border-[1.5px] border-neutral-300 p-2 font-medium text-neutral-400">
452
438
  <div>
@@ -480,7 +466,7 @@ export function generateBaseGridOptions(dataCube: DataCubeState): GridOptions {
480
466
  },
481
467
  onBodyScrollEnd: () => grid.setScrollHintText(undefined),
482
468
  scrollbarWidth: 10,
483
- alwaysShowVerticalScroll: true, // this is needed to ensure
469
+ alwaysShowVerticalScroll: true, // this is needed to ensure column resize calculation is accurate
484
470
  // -------------------------------------- CONTEXT MENU --------------------------------------
485
471
  preventDefaultOnContextMenu: true, // prevent showing the browser's context menu
486
472
  columnMenu: 'new', // ensure context menu works on header
@@ -525,7 +511,9 @@ export function generateBaseGridOptions(dataCube: DataCubeState): GridOptions {
525
511
  suppressScrollOnNewData: true,
526
512
  suppressServerSideFullWidthLoadingRow: true, // make sure each column has its own loading indicator instead of the whole row
527
513
  // -------------------------------------- SELECTION --------------------------------------
528
- enableRangeSelection: true,
514
+ selection: {
515
+ mode: 'cell',
516
+ },
529
517
  // -------------------------------------- SIDEBAR --------------------------------------
530
518
  sideBar: {
531
519
  toolPanels: [
@@ -553,6 +541,38 @@ export function generateBaseGridOptions(dataCube: DataCubeState): GridOptions {
553
541
  };
554
542
  }
555
543
 
544
+ function generatePivotResultColumnHeaderTooltip(
545
+ id: string,
546
+ snapshot: DataCubeQuerySnapshot,
547
+ configuration: DataCubeConfiguration,
548
+ ) {
549
+ const values = id.split(PIVOT_COLUMN_NAME_VALUE_SEPARATOR);
550
+ if (
551
+ !snapshot.data.pivot ||
552
+ values.length > snapshot.data.pivot.columns.length + 1
553
+ ) {
554
+ return values.join(' / ');
555
+ }
556
+ if (values.length === snapshot.data.pivot.columns.length + 1) {
557
+ const baseColumnName = guaranteeNonNullable(values[values.length - 1]);
558
+ const columnConfiguration = _findCol(configuration.columns, baseColumnName);
559
+ return `Column = ${
560
+ columnConfiguration
561
+ ? columnConfiguration.displayName
562
+ ? `${columnConfiguration.displayName} (${columnConfiguration.name})`
563
+ : columnConfiguration.name
564
+ : baseColumnName
565
+ } ~ [ ${snapshot.data.pivot.columns.map((col, i) => `${_findCol(configuration.columns, col.name)?.displayName ?? col.name} = ${values[i]}`).join(', ')} ]`;
566
+ }
567
+ return `[ ${snapshot.data.pivot.columns
568
+ .slice(0, values.length)
569
+ .map(
570
+ (col, i) =>
571
+ `${_findCol(configuration.columns, col.name)?.displayName ?? col.name} = ${values[i]}`,
572
+ )
573
+ .join(', ')} ]`;
574
+ }
575
+
556
576
  function generateDefinitionForPivotResultColumns(
557
577
  pivotResultColumns: DataCubeQuerySnapshotColumn[],
558
578
  snapshot: DataCubeQuerySnapshot,
@@ -570,7 +590,7 @@ function generateDefinitionForPivotResultColumns(
570
590
 
571
591
  columns.forEach((col) => {
572
592
  const groups: ColGroupDef[] = [];
573
- let leaf!: ColDef;
593
+ let leaf: ColDef | undefined = undefined;
574
594
  let id = '';
575
595
  for (let i = 0; i < col.values.length; i++) {
576
596
  const value = getNonNullableEntry(col.values, i);
@@ -585,11 +605,17 @@ function generateDefinitionForPivotResultColumns(
585
605
  children: [],
586
606
  suppressColumnsToolPanel: true,
587
607
  headerName: value,
608
+ headerTooltip: generatePivotResultColumnHeaderTooltip(
609
+ id,
610
+ snapshot,
611
+ configuration,
612
+ ),
588
613
  } satisfies ColGroupDef);
589
614
  } else {
590
615
  const column = _findCol(configuration.columns, value);
591
616
  if (column) {
592
617
  const columnData = {
618
+ name: col.name,
593
619
  snapshot,
594
620
  column,
595
621
  configuration,
@@ -608,20 +634,11 @@ function generateDefinitionForPivotResultColumns(
608
634
  lockPinned: true,
609
635
  lockPosition: true,
610
636
  suppressColumnsToolPanel: true, // hide from column tool panel
611
-
612
- // ..._sortSpec(columnData),
613
- // ..._aggSpec(columnData),
614
- } satisfies ColDef;
615
- } else {
616
- leaf = {
617
- headerName: value,
618
- colId: col.name,
619
- field: col.name,
620
-
621
- // NOTE: hide columns which do not have a corresponding base column configuration
622
- // these could be internal columns (such as count)
623
- hide: true,
624
- suppressColumnsToolPanel: true, // hide from column tool panel
637
+ headerTooltip: generatePivotResultColumnHeaderTooltip(
638
+ id,
639
+ snapshot,
640
+ configuration,
641
+ ),
625
642
  } satisfies ColDef;
626
643
  }
627
644
  }
@@ -644,10 +661,11 @@ function generateDefinitionForPivotResultColumns(
644
661
  currentCollection = newGroup.children;
645
662
  }
646
663
  });
647
- currentCollection.push(leaf);
648
- });
649
664
 
650
- // TODO: decorate header colors, etc.
665
+ if (leaf) {
666
+ currentCollection.push(leaf);
667
+ }
668
+ });
651
669
 
652
670
  return columnDefs;
653
671
  }
@@ -657,21 +675,36 @@ export function generateColumnDefs(
657
675
  configuration: DataCubeConfiguration,
658
676
  dataCube: DataCubeState,
659
677
  ) {
678
+ // NOTE: only show columns which are fetched in select() as we
679
+ // can't solely rely on column selection because of certain restrictions
680
+ // from ag-grid, e.g. in the case of row grouping tree column: the columns
681
+ // which are grouped must be present in the column definitions, so even
682
+ // when some of these might not be selected explicitly by the users, they
683
+ // must still be included in the column definitions, and made hidden instead.
684
+ let columns = configuration.columns.filter((col) =>
685
+ snapshot.data.selectColumns.find((column) => column.name === col.name),
686
+ );
660
687
  let pivotResultColumns: DataCubeQuerySnapshotColumn[] = [];
661
- let columnsToDisplay = configuration.columns;
688
+
662
689
  if (snapshot.data.pivot) {
663
690
  const castColumns = snapshot.data.pivot.castColumns;
664
- pivotResultColumns = castColumns.filter((column) =>
665
- column.name.includes(PIVOT_COLUMN_NAME_VALUE_SEPARATOR),
666
- );
667
- columnsToDisplay = configuration.columns.filter(
668
- (column) =>
669
- castColumns.find((col) => col.name === column.name) ??
670
- snapshot.data.groupExtendedColumns.find(
671
- (col) => col.name === column.name,
672
- ),
691
+ pivotResultColumns = castColumns.filter((col) =>
692
+ isPivotResultColumnName(col.name),
673
693
  );
694
+ // Since fetching cast columns is an expensive operation, we often do this asynchronously
695
+ // so sometimes, the grid column definitions might be generated with incorrect casting
696
+ // information. In order to account for those cases, we include all select() columns
697
+ // to make sure pivoting information is properly propagated to server-side row model datasource.
698
+ columns = [
699
+ ...columns.filter((col) =>
700
+ castColumns.find((column) => column.name === col.name),
701
+ ),
702
+ ...columns.filter(
703
+ (col) => !castColumns.find((column) => column.name === col.name),
704
+ ),
705
+ ];
674
706
  }
707
+
675
708
  return [
676
709
  {
677
710
  headerName: '',
@@ -694,13 +727,11 @@ export function generateColumnDefs(
694
727
  lockPinned: true,
695
728
  lockPosition: true,
696
729
  pinned: GridClientPinnedAlignement.LEFT,
697
- cellStyle: {
698
- flex: 1,
699
- justifyContent: 'space-between',
700
- display: 'flex',
701
- },
702
- cellDataType: 'text',
703
- flex: 1,
730
+ suppressSpanHeaderHeight: true,
731
+ cellDataType: false,
732
+ minWidth: 200,
733
+ suppressAutoSize: true,
734
+ suppressSizeToFit: true,
704
735
  loadingCellRenderer: DataCubeGridLoadingCellRenderer,
705
736
  // TODO: we can support this in the configuration (support sorting by tree-column?)
706
737
  sortable: true,
@@ -722,14 +753,20 @@ export function generateColumnDefs(
722
753
  configuration,
723
754
  dataCube,
724
755
  ),
725
- ...columnsToDisplay.map((column) => {
756
+ ...columns.map((column) => {
726
757
  const columnData = {
758
+ name: column.name,
727
759
  snapshot,
728
760
  column,
729
761
  configuration,
730
762
  };
731
763
  return {
732
764
  headerName: column.displayName ?? column.name,
765
+ headerTooltip: `Column = ${
766
+ column.displayName
767
+ ? `${column.displayName} (${column.name})`
768
+ : column.name
769
+ }`,
733
770
  suppressSpanHeaderHeight: true,
734
771
  colId: column.name,
735
772
  field: column.name,