@finos/legend-data-cube 0.0.24 → 0.0.25

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 (88) hide show
  1. package/docs/column-configuration.display-value-as-link.md +6 -0
  2. package/docs/column-configuration.kind.md +14 -0
  3. package/docs/column-configuration.missing-value-format.md +5 -0
  4. package/docs/column-configuration.unit.md +5 -0
  5. package/docs/extended-column.level.md +14 -0
  6. package/docs/grid-configuration.row-limit.md +5 -0
  7. package/lib/__lib__/DataCubeDocumentation.d.ts +5 -3
  8. package/lib/__lib__/DataCubeDocumentation.d.ts.map +1 -1
  9. package/lib/__lib__/DataCubeDocumentation.js +5 -3
  10. package/lib/__lib__/DataCubeDocumentation.js.map +1 -1
  11. package/lib/components/core/DataCubeFormUtils.d.ts +1 -0
  12. package/lib/components/core/DataCubeFormUtils.d.ts.map +1 -1
  13. package/lib/components/core/DataCubeFormUtils.js +4 -3
  14. package/lib/components/core/DataCubeFormUtils.js.map +1 -1
  15. package/lib/components/view/editor/DataCubeEditorColumnPropertiesPanel.d.ts.map +1 -1
  16. package/lib/components/view/editor/DataCubeEditorColumnPropertiesPanel.js +12 -9
  17. package/lib/components/view/editor/DataCubeEditorColumnPropertiesPanel.js.map +1 -1
  18. package/lib/components/view/editor/DataCubeEditorColumnSelector.js +2 -2
  19. package/lib/components/view/editor/DataCubeEditorGeneralPropertiesPanel.d.ts.map +1 -1
  20. package/lib/components/view/editor/DataCubeEditorGeneralPropertiesPanel.js +8 -7
  21. package/lib/components/view/editor/DataCubeEditorGeneralPropertiesPanel.js.map +1 -1
  22. package/lib/index.css +2 -2
  23. package/lib/index.css.map +1 -1
  24. package/lib/package.json +1 -1
  25. package/lib/stores/core/DataCubeQueryBuilder.d.ts +3 -0
  26. package/lib/stores/core/DataCubeQueryBuilder.d.ts.map +1 -1
  27. package/lib/stores/core/DataCubeQueryBuilder.js +8 -1
  28. package/lib/stores/core/DataCubeQueryBuilder.js.map +1 -1
  29. package/lib/stores/core/DataCubeQueryBuilderUtils.d.ts +1 -0
  30. package/lib/stores/core/DataCubeQueryBuilderUtils.d.ts.map +1 -1
  31. package/lib/stores/core/DataCubeQueryBuilderUtils.js +14 -7
  32. package/lib/stores/core/DataCubeQueryBuilderUtils.js.map +1 -1
  33. package/lib/stores/core/DataCubeQueryEngine.d.ts +6 -0
  34. package/lib/stores/core/DataCubeQueryEngine.d.ts.map +1 -1
  35. package/lib/stores/core/DataCubeQueryEngine.js +7 -0
  36. package/lib/stores/core/DataCubeQueryEngine.js.map +1 -1
  37. package/lib/stores/core/models/DataCubeConfiguration.d.ts +1 -0
  38. package/lib/stores/core/models/DataCubeConfiguration.d.ts.map +1 -1
  39. package/lib/stores/core/models/DataCubeConfiguration.js +2 -0
  40. package/lib/stores/core/models/DataCubeConfiguration.js.map +1 -1
  41. package/lib/stores/view/editor/DataCubeEditorGeneralPropertiesPanelState.d.ts +2 -2
  42. package/lib/stores/view/editor/DataCubeEditorGeneralPropertiesPanelState.d.ts.map +1 -1
  43. package/lib/stores/view/editor/DataCubeEditorGeneralPropertiesPanelState.js +4 -3
  44. package/lib/stores/view/editor/DataCubeEditorGeneralPropertiesPanelState.js.map +1 -1
  45. package/lib/stores/view/editor/DataCubeEditorMutableConfiguration.d.ts +1 -0
  46. package/lib/stores/view/editor/DataCubeEditorMutableConfiguration.d.ts.map +1 -1
  47. package/lib/stores/view/editor/DataCubeEditorMutableConfiguration.js +5 -0
  48. package/lib/stores/view/editor/DataCubeEditorMutableConfiguration.js.map +1 -1
  49. package/lib/stores/view/grid/DataCubeGridClientEngine.d.ts +14 -2
  50. package/lib/stores/view/grid/DataCubeGridClientEngine.d.ts.map +1 -1
  51. package/lib/stores/view/grid/DataCubeGridClientEngine.js +42 -42
  52. package/lib/stores/view/grid/DataCubeGridClientEngine.js.map +1 -1
  53. package/lib/stores/view/grid/DataCubeGridConfigurationBuilder.d.ts +20 -3
  54. package/lib/stores/view/grid/DataCubeGridConfigurationBuilder.d.ts.map +1 -1
  55. package/lib/stores/view/grid/DataCubeGridConfigurationBuilder.js +81 -35
  56. package/lib/stores/view/grid/DataCubeGridConfigurationBuilder.js.map +1 -1
  57. package/lib/stores/view/grid/DataCubeGridMenuBuilder.js +1 -1
  58. package/lib/stores/view/grid/DataCubeGridMenuBuilder.js.map +1 -1
  59. package/lib/stores/view/grid/DataCubeGridQueryBuilder.d.ts +3 -3
  60. package/lib/stores/view/grid/DataCubeGridQueryBuilder.d.ts.map +1 -1
  61. package/lib/stores/view/grid/DataCubeGridQueryBuilder.js +39 -8
  62. package/lib/stores/view/grid/DataCubeGridQueryBuilder.js.map +1 -1
  63. package/lib/stores/view/grid/DataCubeGridQuerySnapshotBuilder.d.ts +2 -2
  64. package/lib/stores/view/grid/DataCubeGridQuerySnapshotBuilder.d.ts.map +1 -1
  65. package/lib/stores/view/grid/DataCubeGridQuerySnapshotBuilder.js +30 -14
  66. package/lib/stores/view/grid/DataCubeGridQuerySnapshotBuilder.js.map +1 -1
  67. package/lib/stores/view/grid/DataCubeGridState.d.ts +2 -0
  68. package/lib/stores/view/grid/DataCubeGridState.d.ts.map +1 -1
  69. package/lib/stores/view/grid/DataCubeGridState.js +5 -1
  70. package/lib/stores/view/grid/DataCubeGridState.js.map +1 -1
  71. package/package.json +4 -4
  72. package/src/__lib__/DataCubeDocumentation.ts +5 -3
  73. package/src/components/core/DataCubeFormUtils.tsx +5 -1
  74. package/src/components/view/editor/DataCubeEditorColumnPropertiesPanel.tsx +40 -14
  75. package/src/components/view/editor/DataCubeEditorColumnSelector.tsx +2 -2
  76. package/src/components/view/editor/DataCubeEditorGeneralPropertiesPanel.tsx +41 -30
  77. package/src/stores/core/DataCubeQueryBuilder.ts +13 -0
  78. package/src/stores/core/DataCubeQueryBuilderUtils.ts +32 -6
  79. package/src/stores/core/DataCubeQueryEngine.ts +8 -0
  80. package/src/stores/core/models/DataCubeConfiguration.ts +2 -0
  81. package/src/stores/view/editor/DataCubeEditorGeneralPropertiesPanelState.ts +5 -4
  82. package/src/stores/view/editor/DataCubeEditorMutableConfiguration.ts +7 -0
  83. package/src/stores/view/grid/DataCubeGridClientEngine.ts +56 -51
  84. package/src/stores/view/grid/DataCubeGridConfigurationBuilder.tsx +90 -37
  85. package/src/stores/view/grid/DataCubeGridMenuBuilder.tsx +1 -1
  86. package/src/stores/view/grid/DataCubeGridQueryBuilder.ts +70 -14
  87. package/src/stores/view/grid/DataCubeGridQuerySnapshotBuilder.ts +40 -20
  88. package/src/stores/view/grid/DataCubeGridState.ts +12 -1
@@ -19,9 +19,9 @@
19
19
  * These are utilities used to build the query snapshot from the internal state
20
20
  * of the grid client, AG Grid.
21
21
  ***************************************************************************************/
22
- import type { IServerSideGetRowsRequest } from '@ag-grid-community/core';
23
22
  import { type DataCubeQuerySnapshot } from '../../core/DataCubeQuerySnapshot.js';
23
+ import { type DataCubeGridClientDataFetchRequest } from './DataCubeGridClientEngine.js';
24
24
  import { DataCubeConfiguration } from '../../core/models/DataCubeConfiguration.js';
25
25
  export declare function getColumnConfiguration(colName: string, configuration: DataCubeConfiguration): import("../../core/models/DataCubeConfiguration.js").DataCubeColumnConfiguration;
26
- export declare function buildQuerySnapshot(request: IServerSideGetRowsRequest, baseSnapshot: DataCubeQuerySnapshot): DataCubeQuerySnapshot;
26
+ export declare function buildQuerySnapshot(request: DataCubeGridClientDataFetchRequest, baseSnapshot: DataCubeQuerySnapshot): DataCubeQuerySnapshot;
27
27
  //# sourceMappingURL=DataCubeGridQuerySnapshotBuilder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataCubeGridQuerySnapshotBuilder.d.ts","sourceRoot":"","sources":["../../../../src/stores/view/grid/DataCubeGridQuerySnapshotBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;yFAKyF;AAEzF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAWjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AAInF,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,qBAAqB,oFAMrC;AAID,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,EAClC,YAAY,EAAE,qBAAqB,yBAgFpC"}
1
+ {"version":3,"file":"DataCubeGridQuerySnapshotBuilder.d.ts","sourceRoot":"","sources":["../../../../src/stores/view/grid/DataCubeGridQuerySnapshotBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;yFAKyF;AAEzF,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAEjF,OAAO,EAIL,KAAK,kCAAkC,EACxC,MAAM,+BAA+B,CAAC;AAMvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AAInF,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,qBAAqB,oFAMrC;AAID,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,kCAAkC,EAC3C,YAAY,EAAE,qBAAqB,yBAmGpC"}
@@ -13,9 +13,15 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
+ /***************************************************************************************
17
+ * [GRID]
18
+ *
19
+ * These are utilities used to build the query snapshot from the internal state
20
+ * of the grid client, AG Grid.
21
+ ***************************************************************************************/
16
22
  import {} from '../../core/DataCubeQuerySnapshot.js';
17
23
  import { _toCol } from '../../core/models/DataCubeColumn.js';
18
- import { GridClientSortDirection, INTERNAL__GRID_CLIENT_TREE_COLUMN_ID, } from './DataCubeGridClientEngine.js';
24
+ import { DataCubeGridClientSortDirection, INTERNAL__GRID_CLIENT_ROOT_AGGREGATION_COLUMN_ID, INTERNAL__GRID_CLIENT_TREE_COLUMN_ID, } from './DataCubeGridClientEngine.js';
19
25
  import { DataCubeQuerySortDirection, getPivotResultColumnBaseColumnName, isPivotResultColumnName, } from '../../core/DataCubeQueryEngine.js';
20
26
  import { DataCubeConfiguration } from '../../core/models/DataCubeConfiguration.js';
21
27
  import { guaranteeNonNullable, uniqBy } from '@finos/legend-shared';
@@ -27,46 +33,56 @@ export function getColumnConfiguration(colName, configuration) {
27
33
  export function buildQuerySnapshot(request, baseSnapshot) {
28
34
  const snapshot = baseSnapshot.clone();
29
35
  const configuration = DataCubeConfiguration.serialization.fromJson(snapshot.data.configuration);
36
+ const rowGroupColumns = request.rowGroupColumns.filter((col) => col !== INTERNAL__GRID_CLIENT_ROOT_AGGREGATION_COLUMN_ID);
30
37
  // --------------------------------- SELECT ---------------------------------
31
38
  snapshot.data.selectColumns = uniqBy([
32
39
  ...snapshot.data.selectColumns,
33
- ...request.pivotCols.map((col) => getColumnConfiguration(col.id, configuration)),
34
- ...request.rowGroupCols.map((col) => getColumnConfiguration(col.id, configuration)),
40
+ ...request.pivotColumns.map((col) => getColumnConfiguration(col, configuration)),
41
+ ...rowGroupColumns.map((col) => getColumnConfiguration(col, configuration)),
35
42
  ], (col) => col.name).map(_toCol);
36
43
  // --------------------------------- PIVOT ---------------------------------
37
- snapshot.data.pivot = request.pivotCols.length
44
+ snapshot.data.pivot = request.pivotColumns.length
38
45
  ? {
39
- columns: request.pivotCols.map((col) => _toCol(getColumnConfiguration(col.id, configuration))),
46
+ columns: request.pivotColumns.map((col) => _toCol(getColumnConfiguration(col, configuration))),
40
47
  // NOTE: since we re-fetch the cast columns anyway in this flow, we just
41
48
  // reuse the current cast columns
42
49
  castColumns: baseSnapshot.data.pivot?.castColumns ?? [],
43
50
  }
44
51
  : undefined;
45
52
  // --------------------------------- GROUP BY ---------------------------------
46
- snapshot.data.groupBy = request.rowGroupCols.length
53
+ snapshot.data.groupBy = rowGroupColumns.length
47
54
  ? {
48
- columns: request.rowGroupCols.map((col) => _toCol(getColumnConfiguration(col.id, configuration))),
55
+ columns: rowGroupColumns.map((col) => _toCol(getColumnConfiguration(col, configuration))),
49
56
  }
50
57
  : undefined;
51
58
  // --------------------------------- SORT ---------------------------------
52
- snapshot.data.sortColumns = request.sortModel
59
+ snapshot.data.sortColumns = request.sortColumns
53
60
  // Make sure the tree column is not being sorted since it's a synthetic column
54
61
  // the sorting state of this special column is `synthesized` by ag-grid
55
62
  // so when all group by columns are sorted in the same direction, the tree group
56
63
  // column will be sorted in that direction, and vice versa, when user sorts
57
64
  // the tree column, all groupBy columns will be sorted in that direction
58
- .filter((item) => item.colId !== INTERNAL__GRID_CLIENT_TREE_COLUMN_ID)
65
+ .filter((item) => ![
66
+ INTERNAL__GRID_CLIENT_TREE_COLUMN_ID,
67
+ INTERNAL__GRID_CLIENT_ROOT_AGGREGATION_COLUMN_ID,
68
+ ].includes(item.name))
59
69
  .map((item) => ({
60
- name: item.colId,
61
- type: getColumnConfiguration(isPivotResultColumnName(item.colId)
62
- ? getPivotResultColumnBaseColumnName(item.colId)
63
- : item.colId, configuration).type,
64
- direction: item.sort === GridClientSortDirection.ASCENDING
70
+ name: item.name,
71
+ type: getColumnConfiguration(isPivotResultColumnName(item.name)
72
+ ? getPivotResultColumnBaseColumnName(item.name)
73
+ : item.name, configuration).type,
74
+ direction: item.direction === DataCubeGridClientSortDirection.ASCENDING
65
75
  ? DataCubeQuerySortDirection.ASCENDING
66
76
  : DataCubeQuerySortDirection.DESCENDING,
67
77
  }));
68
78
  // --------------------------------- CONFIGURATION ---------------------------------
69
79
  configuration.pivotLayout.expandedPaths = _pruneExpandedPaths(baseSnapshot.data.groupBy?.columns ?? [], snapshot.data.groupBy?.columns ?? [], configuration.pivotLayout.expandedPaths);
80
+ // if root aggregation synthetic column has been removed
81
+ // pdate the configuration to disable root aggregation
82
+ if (!request.rowGroupColumns.includes(INTERNAL__GRID_CLIENT_ROOT_AGGREGATION_COLUMN_ID) &&
83
+ configuration.showRootAggregation) {
84
+ configuration.showRootAggregation = false;
85
+ }
70
86
  snapshot.data.configuration = configuration.serialize();
71
87
  // --------------------------------- FINALIZE ---------------------------------
72
88
  return snapshot;
@@ -1 +1 @@
1
- {"version":3,"file":"DataCubeGridQuerySnapshotBuilder.js","sourceRoot":"","sources":["../../../../src/stores/view/grid/DataCubeGridQuerySnapshotBuilder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DataCubeGridQuerySnapshotBuilder.js","sourceRoot":"","sources":["../../../../src/stores/view/grid/DataCubeGridQuerySnapshotBuilder.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
+ import { type DebouncedFunc } from '@finos/legend-shared';
16
17
  import type { GridApi } from '@ag-grid-community/core';
17
18
  import type { DataCubeViewState } from '../DataCubeViewState.js';
18
19
  import { DataCubeGridClientServerSideDataSource } from './DataCubeGridClientEngine.js';
@@ -45,6 +46,7 @@ export declare class DataCubeGridState extends DataCubeQuerySnapshotController {
45
46
  rowLimit?: number | undefined;
46
47
  isPaginationEnabled: boolean;
47
48
  scrollHintText?: string | undefined;
49
+ debouncedAutoResizeColumns?: DebouncedFunc<() => void>;
48
50
  constructor(view: DataCubeViewState);
49
51
  setPaginationEnabled(val: boolean): void;
50
52
  setScrollHintText(val: string | undefined): void;
@@ -1 +1 @@
1
- {"version":3,"file":"DataCubeGridState.d.ts","sourceRoot":"","sources":["../../../../src/stores/view/grid/DataCubeGridState.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EACL,sCAAsC,EAMvC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,+BAA+B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAEjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;AAErF;;;;;;;;;;;;;;GAcG;AACH,qBAAa,iBAAkB,SAAQ,+BAA+B;IACpE,QAAQ,CAAC,UAAU,EAAG,2BAA2B,CAAC;IAClD,QAAQ,CAAC,YAAY,EAAG,8BAA8B,CAAC;IACvD,OAAO,CAAC,OAAO,CAAC,CAAsB;IAEtC,gBAAgB,EAAE,sCAAsC,CAAC;IAEzD,kBAAkB,EAAE,qBAAqB,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,mBAAmB,UAAmD;IACtE,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;gBAExB,IAAI,EAAE,iBAAiB;IAyBnC,oBAAoB,CAAC,GAAG,EAAE,OAAO;IAiBjC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IAIzC,IAAI,MAAM,iBAET;IAED,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS;IAI/B,yBAAyB;IAInB,aAAa,CAC1B,QAAQ,EAAE,qBAAqB,EAC/B,gBAAgB,EAAE,qBAAqB,GAAG,SAAS;CA2CtD"}
1
+ {"version":3,"file":"DataCubeGridState.d.ts","sourceRoot":"","sources":["../../../../src/stores/view/grid/DataCubeGridState.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EACL,sCAAsC,EAMvC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,+BAA+B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAEjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;AAErF;;;;;;;;;;;;;;GAcG;AACH,qBAAa,iBAAkB,SAAQ,+BAA+B;IACpE,QAAQ,CAAC,UAAU,EAAG,2BAA2B,CAAC;IAClD,QAAQ,CAAC,YAAY,EAAG,8BAA8B,CAAC;IACvD,OAAO,CAAC,OAAO,CAAC,CAAsB;IAEtC,gBAAgB,EAAE,sCAAsC,CAAC;IAEzD,kBAAkB,EAAE,qBAAqB,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,mBAAmB,UAAmD;IACtE,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAGpC,0BAA0B,CAAC,EAAE,aAAa,CAAC,MAAM,IAAI,CAAC,CAAC;gBAE3C,IAAI,EAAE,iBAAiB;IAyBnC,oBAAoB,CAAC,GAAG,EAAE,OAAO;IAiBjC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IAIzC,IAAI,MAAM,iBAET;IAED,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS;IAQ/B,yBAAyB;IAInB,aAAa,CAC1B,QAAQ,EAAE,qBAAqB,EAC/B,gBAAgB,EAAE,qBAAqB,GAAG,SAAS;CA2CtD"}
@@ -13,7 +13,7 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { guaranteeNonNullable } from '@finos/legend-shared';
16
+ import { debounce, guaranteeNonNullable, } from '@finos/legend-shared';
17
17
  import { action, makeObservable, observable } from 'mobx';
18
18
  import { DataCubeGridClientServerSideDataSource, INTERNAL__GRID_CLIENT_DEFAULT_CACHE_BLOCK_SIZE, INTERNAL__GRID_CLIENT_DATA_FETCH_MANUAL_TRIGGER_COLUMN_ID, INTERNAL__GRID_CLIENT_MAX_CACHE_BLOCK_SIZE, INTERNAL__GRID_CLIENT_DEFAULT_ENABLE_PAGINATION, computeHashCodeForDataFetchManualTrigger, } from './DataCubeGridClientEngine.js';
19
19
  import { DataCubeQuerySnapshotController } from '../DataCubeQuerySnapshotManager.js';
@@ -45,6 +45,9 @@ export class DataCubeGridState extends DataCubeQuerySnapshotController {
45
45
  rowLimit;
46
46
  isPaginationEnabled = INTERNAL__GRID_CLIENT_DEFAULT_ENABLE_PAGINATION;
47
47
  scrollHintText;
48
+ // As we resize columns dynamically to fit their content, virtual columns are being rendered
49
+ // and resized as user scrolls horizontally, this can cause performance issues, so we debounce.
50
+ debouncedAutoResizeColumns;
48
51
  constructor(view) {
49
52
  super(view);
50
53
  makeObservable(this, {
@@ -85,6 +88,7 @@ export class DataCubeGridState extends DataCubeQuerySnapshotController {
85
88
  }
86
89
  configureClient(val) {
87
90
  this._client = val;
91
+ this.debouncedAutoResizeColumns = debounce(() => val?.autoSizeAllColumns(), 100);
88
92
  }
89
93
  getSnapshotSubscriberName() {
90
94
  return 'grid';
@@ -1 +1 @@
1
- {"version":3,"file":"DataCubeGridState.js","sourceRoot":"","sources":["../../../../src/stores/view/grid/DataCubeGridState.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DataCubeGridState.js","sourceRoot":"","sources":["../../../../src/stores/view/grid/DataCubeGridState.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@finos/legend-data-cube",
3
- "version": "0.0.24",
3
+ "version": "0.0.25",
4
4
  "description": "Legend Data Cube",
5
5
  "keywords": [
6
6
  "legend",
@@ -57,8 +57,8 @@
57
57
  "@ag-grid-enterprise/server-side-row-model": "32.3.3",
58
58
  "@ag-grid-enterprise/side-bar": "32.3.3",
59
59
  "@finos/legend-art": "7.1.68",
60
- "@finos/legend-code-editor": "2.0.19",
61
- "@finos/legend-graph": "31.10.53",
60
+ "@finos/legend-code-editor": "2.0.20",
61
+ "@finos/legend-graph": "31.10.54",
62
62
  "@finos/legend-shared": "10.0.61",
63
63
  "@types/react": "18.3.12",
64
64
  "mathjs": "14.0.0",
@@ -70,7 +70,7 @@
70
70
  "serializr": "3.0.3"
71
71
  },
72
72
  "devDependencies": {
73
- "@finos/legend-dev-utils": "2.1.29",
73
+ "@finos/legend-dev-utils": "2.1.30",
74
74
  "@jest/globals": "29.7.0",
75
75
  "cross-env": "7.0.3",
76
76
  "eslint": "9.15.0",
@@ -16,7 +16,9 @@
16
16
 
17
17
  export enum DocumentationKey {
18
18
  DATA_CUBE_EXTENDED_COLUMN_LEVELS = 'data-cube.extended-column.levels',
19
- DATA_CUBE_COLUMN_KINDS = 'data-cube.column.kinds',
20
- DATA_CUBE_COLUMN_DISPLAY_AS_LINK = 'data-cube.column.display-as-link',
21
- DATA_CUBE_COLUMN_MISSING_VALUE_FORMAT = 'data-cube.column.missing-value-format',
19
+ DATA_CUBE_GRID_CONFIGURATION_ROW_LIMIT = 'data-cube.grid-configuration.row-limit',
20
+ DATA_CUBE_COLUMN_CONFIGURATION_KIND = 'data-cube.column-configuration.kind',
21
+ DATA_CUBE_COLUMN_CONFIGURATION_UNIT = 'data-cube.column-configuration.unit',
22
+ DATA_CUBE_COLUMN_CONFIGURATION_DISPLAY_AS_LINK = 'data-cube.column-configuration.display-value-as-link',
23
+ DATA_CUBE_COLUMN_CONFIGURATION_MISSING_VALUE_FORMAT = 'data-cube.column-configuration.missing-value-format',
22
24
  }
@@ -83,6 +83,7 @@ export const FormNumberInput = forwardRef(function FormNumberInput(
83
83
  defaultValue,
84
84
  disabled,
85
85
  className,
86
+ ...innerProps
86
87
  } = props;
87
88
  const [inputValue, setInputValue] = useState<string | number>(value ?? '');
88
89
  const inputRef = useRef<HTMLInputElement>(null);
@@ -99,6 +100,7 @@ export const FormNumberInput = forwardRef(function FormNumberInput(
99
100
  className,
100
101
  )}
101
102
  ref={handleRef}
103
+ {...innerProps}
102
104
  inputMode="numeric"
103
105
  type="number"
104
106
  min={min}
@@ -247,9 +249,10 @@ export const FormDropdownMenuTrigger = forwardRef<
247
249
  HTMLButtonElement,
248
250
  React.ButtonHTMLAttributes<HTMLButtonElement> & {
249
251
  open?: boolean | undefined;
252
+ showAsPlaceholder?: boolean | undefined;
250
253
  }
251
254
  >(function FormDropdownMenuTrigger(props, ref) {
252
- const { children, className, open, ...otherProps } = props;
255
+ const { children, className, open, showAsPlaceholder, ...otherProps } = props;
253
256
  return (
254
257
  <button
255
258
  ref={ref}
@@ -258,6 +261,7 @@ export const FormDropdownMenuTrigger = forwardRef<
258
261
  {
259
262
  'border-sky-600': Boolean(open),
260
263
  'bg-sky-100': Boolean(open),
264
+ 'text-neutral-400': Boolean(showAsPlaceholder),
261
265
  },
262
266
  className,
263
267
  )}
@@ -42,6 +42,7 @@ import {
42
42
  DEFAULT_COLUMN_MIN_WIDTH,
43
43
  DEFAULT_COLUMN_WIDTH,
44
44
  DEFAULT_URL_LABEL_QUERY_PARAM,
45
+ EMPTY_VALUE_PLACEHOLDER,
45
46
  } from '../../../stores/core/DataCubeQueryEngine.js';
46
47
  import { DocumentationKey } from '../../../__lib__/DataCubeDocumentation.js';
47
48
  import type { DataCubeViewState } from '../../../stores/view/DataCubeViewState.js';
@@ -139,7 +140,7 @@ export const DataCubeEditorColumnPropertiesPanel = observer(
139
140
  >
140
141
  <div className="flex h-full w-full items-center">
141
142
  <div className="overflow-hidden overflow-ellipsis whitespace-nowrap">
142
- {selectedColumn?.name ?? '(None)'}
143
+ {selectedColumn?.name ?? EMPTY_VALUE_PLACEHOLDER}
143
144
  </div>
144
145
  {selectedColumn && (
145
146
  <>
@@ -217,7 +218,7 @@ export const DataCubeEditorColumnPropertiesPanel = observer(
217
218
  <FormDocumentation
218
219
  className="ml-1"
219
220
  documentationKey={
220
- DocumentationKey.DATA_CUBE_COLUMN_KINDS
221
+ DocumentationKey.DATA_CUBE_COLUMN_CONFIGURATION_KIND
221
222
  }
222
223
  />
223
224
  </div>
@@ -326,7 +327,7 @@ export const DataCubeEditorColumnPropertiesPanel = observer(
326
327
 
327
328
  <FormCheckbox
328
329
  className="ml-3"
329
- label="Exclude from H-Pivot"
330
+ label="Exclude from horizontal pivot"
330
331
  checked={selectedColumn.excludedFromPivot}
331
332
  onChange={() =>
332
333
  selectedColumn.setExcludedFromPivot(
@@ -355,7 +356,7 @@ export const DataCubeEditorColumnPropertiesPanel = observer(
355
356
  }}
356
357
  />
357
358
  <div className="ml-1 flex-shrink-0 text-sm">
358
- Decimal places
359
+ decimal places
359
360
  </div>
360
361
  <FormCheckbox
361
362
  className="ml-3"
@@ -380,15 +381,19 @@ export const DataCubeEditorColumnPropertiesPanel = observer(
380
381
  </div>
381
382
 
382
383
  <div className="mt-2 flex h-5 w-full items-center">
383
- <div className="flex h-full w-32 flex-shrink-0 items-center text-sm">
384
- Number Scale:
384
+ <div className="flex h-full w-32 flex-shrink-0 items-center text-sm" />
385
+ <div className="mr-1 flex h-full flex-shrink-0 items-center text-sm">
386
+ Scale:
385
387
  </div>
386
388
  <FormDropdownMenuTrigger
387
389
  className="w-32"
388
390
  onClick={openNumberScaleDropdown}
389
391
  open={numberScaleDropdownPropsOpen}
392
+ showAsPlaceholder={
393
+ selectedColumn.numberScale === undefined
394
+ }
390
395
  >
391
- {selectedColumn.numberScale ?? '(None)'}
396
+ {selectedColumn.numberScale ?? EMPTY_VALUE_PLACEHOLDER}
392
397
  </FormDropdownMenuTrigger>
393
398
  <FormDropdownMenu
394
399
  className="w-32"
@@ -412,10 +417,30 @@ export const DataCubeEditorColumnPropertiesPanel = observer(
412
417
  }}
413
418
  autoFocus={scale === selectedColumn.numberScale}
414
419
  >
415
- {scale ?? '(None)'}
420
+ {scale ?? EMPTY_VALUE_PLACEHOLDER}
416
421
  </FormDropdownMenuItem>
417
422
  ))}
418
423
  </FormDropdownMenu>
424
+ <div className="ml-3 mr-1 flex h-full flex-shrink-0 items-center text-sm">
425
+ Unit:
426
+ <FormDocumentation
427
+ className="ml-1"
428
+ documentationKey={
429
+ DocumentationKey.DATA_CUBE_COLUMN_CONFIGURATION_UNIT
430
+ }
431
+ />
432
+ </div>
433
+ <FormTextInput
434
+ className="w-16"
435
+ value={selectedColumn.unit ?? ''}
436
+ onChange={(event) => {
437
+ const value = event.target.value.trim();
438
+ selectedColumn.setUnit(
439
+ value.trim() !== '' ? value.trim() : undefined,
440
+ );
441
+ }}
442
+ placeholder={EMPTY_VALUE_PLACEHOLDER}
443
+ />
419
444
  </div>
420
445
  </>
421
446
  )}
@@ -428,7 +453,7 @@ export const DataCubeEditorColumnPropertiesPanel = observer(
428
453
  <FormDocumentation
429
454
  className="ml-1"
430
455
  documentationKey={
431
- DocumentationKey.DATA_CUBE_COLUMN_DISPLAY_AS_LINK
456
+ DocumentationKey.DATA_CUBE_COLUMN_CONFIGURATION_DISPLAY_AS_LINK
432
457
  }
433
458
  />
434
459
  </div>
@@ -461,11 +486,11 @@ export const DataCubeEditorColumnPropertiesPanel = observer(
461
486
 
462
487
  <div className="mt-2 flex h-5 w-full items-center">
463
488
  <div className="flex h-full w-32 flex-shrink-0 items-center text-sm">
464
- {`Missing Value Format:`}
489
+ Missing Value Format:
465
490
  <FormDocumentation
466
491
  className="ml-1"
467
492
  documentationKey={
468
- DocumentationKey.DATA_CUBE_COLUMN_MISSING_VALUE_FORMAT
493
+ DocumentationKey.DATA_CUBE_COLUMN_CONFIGURATION_MISSING_VALUE_FORMAT
469
494
  }
470
495
  />
471
496
  </div>
@@ -478,7 +503,7 @@ export const DataCubeEditorColumnPropertiesPanel = observer(
478
503
  value !== '' ? value : undefined,
479
504
  );
480
505
  }}
481
- placeholder="(empty)"
506
+ placeholder={EMPTY_VALUE_PLACEHOLDER}
482
507
  />
483
508
  </div>
484
509
 
@@ -514,8 +539,9 @@ export const DataCubeEditorColumnPropertiesPanel = observer(
514
539
  className="w-16"
515
540
  onClick={openColumnPinDropdown}
516
541
  open={columnPinDropdownPropsOpen}
542
+ showAsPlaceholder={selectedColumn.pinned === undefined}
517
543
  >
518
- {selectedColumn.pinned ?? '(None)'}
544
+ {selectedColumn.pinned ?? EMPTY_VALUE_PLACEHOLDER}
519
545
  </FormDropdownMenuTrigger>
520
546
  <FormDropdownMenu
521
547
  className="w-16"
@@ -534,7 +560,7 @@ export const DataCubeEditorColumnPropertiesPanel = observer(
534
560
  }}
535
561
  autoFocus={placement === selectedColumn.pinned}
536
562
  >
537
- {placement ?? '(None)'}
563
+ {placement ?? EMPTY_VALUE_PLACEHOLDER}
538
564
  </FormDropdownMenuItem>
539
565
  ))}
540
566
  </FormDropdownMenu>
@@ -195,7 +195,7 @@ export const DataCubeEditorColumnSelector = observer(
195
195
  /**
196
196
  * Since we use managed row dragging for selected columns,
197
197
  * we just need to sync the row data with the state.
198
- * Dragging (multiple) row(s) to specific position have been
198
+ * Dragging (multiple) rows to specific position have been
199
199
  * handled by ag-grid.
200
200
  */
201
201
  const onSelectedColumnsDragStop = useCallback(
@@ -223,7 +223,7 @@ export const DataCubeEditorColumnSelector = observer(
223
223
  /**
224
224
  * Since we use managed row dragging for selected columns,
225
225
  * we just need to sync the row data with the state
226
- * Dragging (multiple) row(s) to specific position have been
226
+ * Dragging (multiple) rows to specific position have been
227
227
  * handled by ag-grid.
228
228
  */
229
229
  const onSelectedColumnsDragEnd = useCallback(
@@ -29,6 +29,7 @@ import {
29
29
  DEFAULT_NEGATIVE_FOREGROUND_COLOR,
30
30
  DEFAULT_ROW_HIGHLIGHT_BACKGROUND_COLOR,
31
31
  DEFAULT_ZERO_FOREGROUND_COLOR,
32
+ EMPTY_VALUE_PLACEHOLDER,
32
33
  } from '../../../stores/core/DataCubeQueryEngine.js';
33
34
  import {
34
35
  FormCheckbox,
@@ -40,8 +41,10 @@ import {
40
41
  FormTextInput,
41
42
  FormNumberInput,
42
43
  FormBadge_WIP,
44
+ FormDocumentation,
43
45
  } from '../../core/DataCubeFormUtils.js';
44
46
  import type { DataCubeViewState } from '../../../stores/view/DataCubeViewState.js';
47
+ import { DocumentationKey } from '../../../__lib__/DataCubeDocumentation.js';
45
48
 
46
49
  export const DataCubeEditorGeneralPropertiesPanel = observer(
47
50
  (props: { view: DataCubeViewState }) => {
@@ -117,9 +120,7 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(
117
120
  !configuration.showRootAggregation,
118
121
  )
119
122
  }
120
- disabled={true}
121
123
  />
122
- <FormBadge_WIP />
123
124
  <FormCheckbox
124
125
  className="ml-3"
125
126
  label="Show leaf count"
@@ -128,7 +129,11 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(
128
129
  configuration.setShowLeafCount(!configuration.showLeafCount)
129
130
  }
130
131
  />
131
- <div className="ml-3 mr-1.5 flex h-full flex-shrink-0 items-center text-sm">
132
+ </div>
133
+
134
+ <div className="mt-2 flex h-5 w-full items-center">
135
+ <div className="flex h-full w-32 flex-shrink-0 items-center text-sm" />
136
+ <div className="mr-1 flex h-full flex-shrink-0 items-center text-sm">
132
137
  Sort:
133
138
  </div>
134
139
  <FormDropdownMenuTrigger
@@ -160,19 +165,18 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(
160
165
  </FormDropdownMenuItem>
161
166
  ))}
162
167
  </FormDropdownMenu>
163
- </div>
164
-
165
- <div className="mt-2 flex h-5 w-full items-center">
166
- <div className="flex h-full w-32 flex-shrink-0 items-center text-sm" />
167
- <div className="mr-1.5 flex h-full flex-shrink-0 items-center text-sm">
168
+ <div className="ml-3 mr-1 flex h-full flex-shrink-0 items-center text-sm">
168
169
  Initially expand to level:
169
170
  </div>
170
171
  <FormDropdownMenuTrigger
171
172
  className="w-16"
172
173
  onClick={openInitialExpandLevelDropdown}
173
174
  open={initialExpandLevelDropdownPropsOpen}
175
+ showAsPlaceholder={
176
+ configuration.initialExpandLevel === undefined
177
+ }
174
178
  >
175
- {configuration.initialExpandLevel ?? '(None)'}
179
+ {configuration.initialExpandLevel ?? EMPTY_VALUE_PLACEHOLDER}
176
180
  </FormDropdownMenuTrigger>
177
181
  <FormDropdownMenu
178
182
  className="w-16"
@@ -187,7 +191,7 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(
187
191
  }}
188
192
  autoFocus={level === configuration.initialExpandLevel}
189
193
  >
190
- {level ?? '(None)'}
194
+ {level ?? EMPTY_VALUE_PLACEHOLDER}
191
195
  </FormDropdownMenuItem>
192
196
  ))}
193
197
  </FormDropdownMenu>
@@ -196,20 +200,22 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(
196
200
  <div className="mt-2 flex h-5 w-full items-center">
197
201
  <div className="flex h-full w-32 flex-shrink-0 items-center text-sm">
198
202
  Row Limit:
203
+ <FormDocumentation
204
+ className="ml-1"
205
+ documentationKey={
206
+ DocumentationKey.DATA_CUBE_GRID_CONFIGURATION_ROW_LIMIT
207
+ }
208
+ />
199
209
  </div>
200
210
  <FormNumberInput
201
211
  className="w-16 text-sm"
202
212
  value={panel.limit}
203
- min={-1}
213
+ min={0}
204
214
  step={1}
205
- defaultValue={-1}
206
- isValid={(value) => value !== undefined && value >= -1}
207
- setValue={(value) => panel.setLimit(value ?? -1)}
215
+ defaultValue={undefined}
216
+ placeholder={EMPTY_VALUE_PLACEHOLDER}
217
+ setValue={(value) => panel.setLimit(value)}
208
218
  />
209
- <div className="flex-shrink-0 pl-1 text-sm italic text-neutral-500">
210
- Truncate result to this many rows at every level. Use -1 for
211
- unlimited.
212
- </div>
213
219
  </div>
214
220
 
215
221
  <div className="mt-2 flex h-5 w-full items-center">
@@ -264,9 +270,10 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(
264
270
  )
265
271
  }
266
272
  />
267
- <div className="ml-2 h-[1px] w-2 flex-shrink-0 bg-neutral-400" />
273
+ <div className="ml-3 mr-1 flex h-full flex-shrink-0 items-center text-sm">
274
+ Color:
275
+ </div>
268
276
  <FormColorPickerButton
269
- className="ml-2"
270
277
  color={configuration.gridLineColor}
271
278
  defaultColor={DEFAULT_GRID_LINE_COLOR}
272
279
  onChange={(value) => configuration.setGridLineColor(value)}
@@ -291,7 +298,6 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(
291
298
  />
292
299
  <FormCheckbox
293
300
  className="ml-3"
294
- label="Custom: Alternate color every"
295
301
  checked={configuration.alternateRows}
296
302
  onChange={() => {
297
303
  if (configuration.alternateRows) {
@@ -302,8 +308,20 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(
302
308
  }
303
309
  }}
304
310
  />
311
+ <div className="ml-1 mr-1 flex h-full flex-shrink-0 items-center text-sm">
312
+ Custom: Alternate color:
313
+ </div>
314
+ <FormColorPickerButton
315
+ disabled={!configuration.alternateRows}
316
+ color={configuration.alternateRowsColor}
317
+ defaultColor={DEFAULT_ROW_HIGHLIGHT_BACKGROUND_COLOR}
318
+ onChange={(value) => configuration.setAlternateRowsColor(value)}
319
+ />
320
+ <div className="ml-1 flex h-full flex-shrink-0 items-center text-sm">
321
+ every:
322
+ </div>
305
323
  <FormNumberInput
306
- className="ml-1.5 w-16 text-sm"
324
+ className="ml-1 w-16 text-sm"
307
325
  disabled={!configuration.alternateRows}
308
326
  min={1}
309
327
  step={1}
@@ -314,14 +332,7 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(
314
332
  configuration.setAlternateRowsCount(value ?? 1)
315
333
  }
316
334
  />
317
- <div className="ml-1.5 flex-shrink-0 text-sm">{`row(s)`}</div>
318
- <FormColorPickerButton
319
- className="ml-[5px]"
320
- disabled={!configuration.alternateRows}
321
- color={configuration.alternateRowsColor}
322
- defaultColor={DEFAULT_ROW_HIGHLIGHT_BACKGROUND_COLOR}
323
- onChange={(value) => configuration.setAlternateRowsColor(value)}
324
- />
335
+ <div className="ml-1 flex-shrink-0 text-sm">rows</div>
325
336
  </div>
326
337
 
327
338
  <div className="my-2 h-[1px] w-full bg-neutral-200" />