@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.
- package/docs/column-configuration.display-value-as-link.md +6 -0
- package/docs/column-configuration.kind.md +14 -0
- package/docs/column-configuration.missing-value-format.md +5 -0
- package/docs/column-configuration.unit.md +5 -0
- package/docs/extended-column.level.md +14 -0
- package/docs/grid-configuration.row-limit.md +5 -0
- package/lib/__lib__/DataCubeDocumentation.d.ts +5 -3
- package/lib/__lib__/DataCubeDocumentation.d.ts.map +1 -1
- package/lib/__lib__/DataCubeDocumentation.js +5 -3
- package/lib/__lib__/DataCubeDocumentation.js.map +1 -1
- package/lib/components/core/DataCubeFormUtils.d.ts +1 -0
- package/lib/components/core/DataCubeFormUtils.d.ts.map +1 -1
- package/lib/components/core/DataCubeFormUtils.js +4 -3
- package/lib/components/core/DataCubeFormUtils.js.map +1 -1
- package/lib/components/view/editor/DataCubeEditorColumnPropertiesPanel.d.ts.map +1 -1
- package/lib/components/view/editor/DataCubeEditorColumnPropertiesPanel.js +12 -9
- package/lib/components/view/editor/DataCubeEditorColumnPropertiesPanel.js.map +1 -1
- package/lib/components/view/editor/DataCubeEditorColumnSelector.js +2 -2
- package/lib/components/view/editor/DataCubeEditorGeneralPropertiesPanel.d.ts.map +1 -1
- package/lib/components/view/editor/DataCubeEditorGeneralPropertiesPanel.js +8 -7
- package/lib/components/view/editor/DataCubeEditorGeneralPropertiesPanel.js.map +1 -1
- package/lib/index.css +2 -2
- package/lib/index.css.map +1 -1
- package/lib/package.json +1 -1
- package/lib/stores/core/DataCubeQueryBuilder.d.ts +3 -0
- package/lib/stores/core/DataCubeQueryBuilder.d.ts.map +1 -1
- package/lib/stores/core/DataCubeQueryBuilder.js +8 -1
- package/lib/stores/core/DataCubeQueryBuilder.js.map +1 -1
- package/lib/stores/core/DataCubeQueryBuilderUtils.d.ts +1 -0
- package/lib/stores/core/DataCubeQueryBuilderUtils.d.ts.map +1 -1
- package/lib/stores/core/DataCubeQueryBuilderUtils.js +14 -7
- package/lib/stores/core/DataCubeQueryBuilderUtils.js.map +1 -1
- package/lib/stores/core/DataCubeQueryEngine.d.ts +6 -0
- package/lib/stores/core/DataCubeQueryEngine.d.ts.map +1 -1
- package/lib/stores/core/DataCubeQueryEngine.js +7 -0
- package/lib/stores/core/DataCubeQueryEngine.js.map +1 -1
- package/lib/stores/core/models/DataCubeConfiguration.d.ts +1 -0
- package/lib/stores/core/models/DataCubeConfiguration.d.ts.map +1 -1
- package/lib/stores/core/models/DataCubeConfiguration.js +2 -0
- package/lib/stores/core/models/DataCubeConfiguration.js.map +1 -1
- package/lib/stores/view/editor/DataCubeEditorGeneralPropertiesPanelState.d.ts +2 -2
- package/lib/stores/view/editor/DataCubeEditorGeneralPropertiesPanelState.d.ts.map +1 -1
- package/lib/stores/view/editor/DataCubeEditorGeneralPropertiesPanelState.js +4 -3
- package/lib/stores/view/editor/DataCubeEditorGeneralPropertiesPanelState.js.map +1 -1
- package/lib/stores/view/editor/DataCubeEditorMutableConfiguration.d.ts +1 -0
- package/lib/stores/view/editor/DataCubeEditorMutableConfiguration.d.ts.map +1 -1
- package/lib/stores/view/editor/DataCubeEditorMutableConfiguration.js +5 -0
- package/lib/stores/view/editor/DataCubeEditorMutableConfiguration.js.map +1 -1
- package/lib/stores/view/grid/DataCubeGridClientEngine.d.ts +14 -2
- package/lib/stores/view/grid/DataCubeGridClientEngine.d.ts.map +1 -1
- package/lib/stores/view/grid/DataCubeGridClientEngine.js +42 -42
- package/lib/stores/view/grid/DataCubeGridClientEngine.js.map +1 -1
- package/lib/stores/view/grid/DataCubeGridConfigurationBuilder.d.ts +20 -3
- package/lib/stores/view/grid/DataCubeGridConfigurationBuilder.d.ts.map +1 -1
- package/lib/stores/view/grid/DataCubeGridConfigurationBuilder.js +81 -35
- package/lib/stores/view/grid/DataCubeGridConfigurationBuilder.js.map +1 -1
- package/lib/stores/view/grid/DataCubeGridMenuBuilder.js +1 -1
- package/lib/stores/view/grid/DataCubeGridMenuBuilder.js.map +1 -1
- package/lib/stores/view/grid/DataCubeGridQueryBuilder.d.ts +3 -3
- package/lib/stores/view/grid/DataCubeGridQueryBuilder.d.ts.map +1 -1
- package/lib/stores/view/grid/DataCubeGridQueryBuilder.js +39 -8
- package/lib/stores/view/grid/DataCubeGridQueryBuilder.js.map +1 -1
- package/lib/stores/view/grid/DataCubeGridQuerySnapshotBuilder.d.ts +2 -2
- package/lib/stores/view/grid/DataCubeGridQuerySnapshotBuilder.d.ts.map +1 -1
- package/lib/stores/view/grid/DataCubeGridQuerySnapshotBuilder.js +30 -14
- package/lib/stores/view/grid/DataCubeGridQuerySnapshotBuilder.js.map +1 -1
- package/lib/stores/view/grid/DataCubeGridState.d.ts +2 -0
- package/lib/stores/view/grid/DataCubeGridState.d.ts.map +1 -1
- package/lib/stores/view/grid/DataCubeGridState.js +5 -1
- package/lib/stores/view/grid/DataCubeGridState.js.map +1 -1
- package/package.json +4 -4
- package/src/__lib__/DataCubeDocumentation.ts +5 -3
- package/src/components/core/DataCubeFormUtils.tsx +5 -1
- package/src/components/view/editor/DataCubeEditorColumnPropertiesPanel.tsx +40 -14
- package/src/components/view/editor/DataCubeEditorColumnSelector.tsx +2 -2
- package/src/components/view/editor/DataCubeEditorGeneralPropertiesPanel.tsx +41 -30
- package/src/stores/core/DataCubeQueryBuilder.ts +13 -0
- package/src/stores/core/DataCubeQueryBuilderUtils.ts +32 -6
- package/src/stores/core/DataCubeQueryEngine.ts +8 -0
- package/src/stores/core/models/DataCubeConfiguration.ts +2 -0
- package/src/stores/view/editor/DataCubeEditorGeneralPropertiesPanelState.ts +5 -4
- package/src/stores/view/editor/DataCubeEditorMutableConfiguration.ts +7 -0
- package/src/stores/view/grid/DataCubeGridClientEngine.ts +56 -51
- package/src/stores/view/grid/DataCubeGridConfigurationBuilder.tsx +90 -37
- package/src/stores/view/grid/DataCubeGridMenuBuilder.tsx +1 -1
- package/src/stores/view/grid/DataCubeGridQueryBuilder.ts +70 -14
- package/src/stores/view/grid/DataCubeGridQuerySnapshotBuilder.ts +40 -20
- 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:
|
|
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,
|
|
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 {
|
|
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.
|
|
34
|
-
...
|
|
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.
|
|
44
|
+
snapshot.data.pivot = request.pivotColumns.length
|
|
38
45
|
? {
|
|
39
|
-
columns: request.
|
|
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 =
|
|
53
|
+
snapshot.data.groupBy = rowGroupColumns.length
|
|
47
54
|
? {
|
|
48
|
-
columns:
|
|
55
|
+
columns: rowGroupColumns.map((col) => _toCol(getColumnConfiguration(col, configuration))),
|
|
49
56
|
}
|
|
50
57
|
: undefined;
|
|
51
58
|
// --------------------------------- SORT ---------------------------------
|
|
52
|
-
snapshot.data.sortColumns = request.
|
|
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) =>
|
|
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.
|
|
61
|
-
type: getColumnConfiguration(isPivotResultColumnName(item.
|
|
62
|
-
? getPivotResultColumnBaseColumnName(item.
|
|
63
|
-
: item.
|
|
64
|
-
direction: item.
|
|
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":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
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;
|
|
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":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,
|
|
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.
|
|
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.
|
|
61
|
-
"@finos/legend-graph": "31.10.
|
|
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.
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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 ??
|
|
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.
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 ??
|
|
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 ??
|
|
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.
|
|
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
|
-
|
|
489
|
+
Missing Value Format:
|
|
465
490
|
<FormDocumentation
|
|
466
491
|
className="ml-1"
|
|
467
492
|
documentationKey={
|
|
468
|
-
DocumentationKey.
|
|
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=
|
|
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 ??
|
|
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 ??
|
|
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)
|
|
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)
|
|
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
|
-
|
|
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
|
-
|
|
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 ??
|
|
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 ??
|
|
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={
|
|
213
|
+
min={0}
|
|
204
214
|
step={1}
|
|
205
|
-
defaultValue={
|
|
206
|
-
|
|
207
|
-
setValue={(value) => panel.setLimit(value
|
|
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-
|
|
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
|
|
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
|
|
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" />
|