From 8aa8324b739e4bf7054f96ce9b516ce8025f5980 Mon Sep 17 00:00:00 2001 From: An Phi Date: Mon, 8 Jul 2024 11:28:07 -0400 Subject: [PATCH] data-cube: support general and column configuration (#3311) * data-cube: support limit * datacube: support customizing grid lines * datacube: allow customizing grid lines * datacube: support alternate row highlighting * datacube: minor fixes * datacube: implement column resizing * datacube: apply number scaling and value formatting * data-cube: optimize organization of properties editor * datacube: support customizing fonts, colors and styling * bump dependencies * datacube: make filter() the first operation * datacube: support font case * datacube: support blur column content * datacube: cleanup color scheme logic * data-cube: support column pinning and resizing * bump dependencies * datacube: support display as link * datacube: infrastructure cleanups --- .changeset/fair-rice-rule.md | 39 + .changeset/nine-balloons-shout.md | 38 + .changeset/old-walls-punch.md | 38 + .changeset/wicked-swans-give.md | 39 + .changeset/young-radios-explain.md | 4 + fixtures/legend-mock-server/package.json | 4 +- package.json | 10 +- packages/babel-preset/package.json | 4 +- packages/eslint-plugin/package.json | 6 +- .../package.json | 4 +- .../legend-application-pure-ide/package.json | 6 +- .../package.json | 4 +- .../package.json | 4 +- .../legend-application-query/package.json | 8 +- .../package.json | 4 +- packages/legend-application-repl/package.json | 26 +- .../LegendREPLFrameworkProvider.tsx | 2 +- .../src/components/REPLStoreProvider.tsx | 2 +- .../src/components/REPLWindow.tsx | 179 ++++ .../src/components/dataCube/DataCube.tsx | 2 +- .../dataCube/editor/DataCubeEditor.tsx | 269 ++--- .../editor/DataCubeEditorCodePanel.tsx | 4 +- .../DataCubeEditorColumnPropertiesPanel.tsx | 759 +++++++++----- .../editor/DataCubeEditorColumnsPanel.tsx | 2 +- .../editor/DataCubeEditorColumnsSelector.tsx | 1 - .../editor/DataCubeEditorDeveloperPanel.tsx | 4 +- .../DataCubeEditorExtendedColumnsPanel.tsx | 4 +- .../editor/DataCubeEditorFilterPanel.tsx | 4 +- .../DataCubeEditorGeneralPropertiesPanel.tsx | 409 ++++---- .../editor/DataCubeEditorHPivotsPanel.tsx | 4 +- .../dataCube/editor/DataCubeEditorShared.tsx | 102 +- .../editor/DataCubeEditorSortsPanel.tsx | 2 +- .../editor/DataCubeEditorVPivotsPanel.tsx | 4 +- .../components/dataCube/grid/DataCubeGrid.tsx | 459 +++++--- .../dataCube/grid/DataCubeGridShared.tsx | 6 +- .../dataCube/grid/menu/DataCubeGridMenu.tsx | 105 +- .../grid/menu/DataCubeGridSortsMenu.tsx | 21 +- .../src/stores/{dataCube => }/REPLStore.ts | 9 +- ...ubeEngine.ts => DataCubeInfrastructure.ts} | 43 +- .../src/stores/dataCube/DataCubeState.ts | 18 +- .../dataCube/core/DataCubeConfiguration.ts | 192 ++-- .../core/DataCubeConfigurationBuilder.ts | 6 +- .../stores/dataCube/core/DataCubeCoreState.ts | 5 +- .../dataCube/core/DataCubeQueryBuilder.ts | 22 +- .../dataCube/core/DataCubeQueryEngine.ts | 119 ++- .../core/DataCubeQuerySnapshotBuilder.ts | 13 +- .../core/DataCubeQuerySnapshotSubscriber.ts | 11 +- .../DataCubeQueryAnalyzer.repl-test.ts | 12 +- ...ataCubeEditorColumnPropertiesPanelState.ts | 14 + .../dataCube/editor/DataCubeEditorState.ts | 45 +- .../editor/DataCubeMutableConfiguration.ts | 386 ++++--- .../dataCube/grid/DataCubeGridClientEngine.ts | 56 +- .../DataCubeGridQuerySnapshotAnalyzer.tsx | 534 +++++++++- .../stores/dataCube/grid/DataCubeGridState.ts | 93 +- .../legend-application-repl/style/_repl.scss | 45 +- .../package.json | 4 +- .../package.json | 4 +- .../legend-application-studio/package.json | 8 +- packages/legend-application/package.json | 6 +- .../ApplicationComponentFrameworkProvider.tsx | 56 + .../ApplicationFrameworkProvider.tsx | 19 +- packages/legend-art/package.json | 10 +- packages/legend-art/src/color/ColorPicker.ts | 4 + .../src/color/TailwindCSSPalette.ts | 1 + packages/legend-art/src/icon/DataCubeIcon.tsx | 8 +- packages/legend-art/src/index.ts | 16 +- .../{panel => layout}/BlankPanelContent.tsx | 0 .../BlankPanelPlaceholder.tsx | 0 .../src/{panel => layout}/Panel.tsx | 0 .../{panel => layout}/PanelDisplayState.ts | 0 .../src/{panel => layout}/PanelDropZone.tsx | 0 .../PanelListSelectorItem.tsx | 0 .../PanelLoadingIndicator.tsx | 0 .../src/{panel => layout}/ResizablePanel.tsx | 0 .../legend-art/src/utils/ComponentUtils.ts | 2 + packages/legend-dev-utils/package.json | 12 +- .../legend-extension-assortment/package.json | 6 +- .../package.json | 6 +- .../package.json | 6 +- .../legend-extension-dsl-diagram/package.json | 8 +- .../package.json | 6 +- .../legend-extension-dsl-service/package.json | 6 +- .../legend-extension-dsl-text/package.json | 6 +- .../package.json | 6 +- .../package.json | 6 +- .../package.json | 6 +- .../package.json | 4 +- packages/legend-graph/package.json | 6 +- packages/legend-lego/package.json | 38 +- packages/legend-manual-tests/package.json | 6 +- packages/legend-query-builder/package.json | 10 +- .../result/tds/QueryBuilderTDSGridResult.tsx | 4 +- .../tds/QueryBuilderTDSSimpleGridResult.tsx | 12 +- packages/legend-server-depot/package.json | 4 +- packages/legend-server-sdlc/package.json | 6 +- .../package.json | 4 +- packages/legend-server-showcase/package.json | 6 +- packages/legend-shared/package.json | 8 +- packages/legend-storage/package.json | 4 +- .../package.json | 4 +- packages/stylelint-config/package.json | 2 +- scripts/test/jest.config.base.js | 4 + yarn.lock | 978 +++++++++--------- 103 files changed, 3590 insertions(+), 1927 deletions(-) create mode 100644 .changeset/fair-rice-rule.md create mode 100644 .changeset/nine-balloons-shout.md create mode 100644 .changeset/old-walls-punch.md create mode 100644 .changeset/wicked-swans-give.md create mode 100644 .changeset/young-radios-explain.md create mode 100644 packages/legend-application-repl/src/components/REPLWindow.tsx rename packages/legend-application-repl/src/stores/{dataCube => }/REPLStore.ts (78%) rename packages/legend-application-repl/src/stores/dataCube/{core/DataCubeEngine.ts => DataCubeInfrastructure.ts} (64%) rename packages/legend-art/src/{panel => layout}/BlankPanelContent.tsx (100%) rename packages/legend-art/src/{panel => layout}/BlankPanelPlaceholder.tsx (100%) rename packages/legend-art/src/{panel => layout}/Panel.tsx (100%) rename packages/legend-art/src/{panel => layout}/PanelDisplayState.ts (100%) rename packages/legend-art/src/{panel => layout}/PanelDropZone.tsx (100%) rename packages/legend-art/src/{panel => layout}/PanelListSelectorItem.tsx (100%) rename packages/legend-art/src/{panel => layout}/PanelLoadingIndicator.tsx (100%) rename packages/legend-art/src/{panel => layout}/ResizablePanel.tsx (100%) diff --git a/.changeset/fair-rice-rule.md b/.changeset/fair-rice-rule.md new file mode 100644 index 0000000000..1f800d7a72 --- /dev/null +++ b/.changeset/fair-rice-rule.md @@ -0,0 +1,39 @@ +--- +'@finos/legend-application-pure-ide-deployment': patch +'@finos/legend-extension-dsl-data-space-studio': patch +'@finos/legend-application-studio-deployment': patch +'@finos/legend-extension-store-service-store': patch +'@finos/legend-vscode-extension-dependencies': patch +'@finos/legend-application-query-deployment': patch +'@finos/legend-application-studio-bootstrap': patch +'@finos/legend-application-query-bootstrap': patch +'@finos/legend-application-repl-deployment': patch +'@finos/legend-extension-store-relational': patch +'@finos/legend-server-showcase-deployment': patch +'@finos/legend-extension-dsl-persistence': patch +'@finos/legend-extension-store-flat-data': patch +'@finos/legend-extension-dsl-data-space': patch +'@finos/legend-extension-tracer-zipkin': patch +'@finos/legend-extension-dsl-diagram': patch +'@finos/legend-extension-dsl-service': patch +'@finos/legend-application-pure-ide': patch +'@finos/legend-extension-assortment': patch +'@finos/legend-application-studio': patch +'@finos/legend-extension-dsl-text': patch +'@finos/legend-application-query': patch +'@finos/legend-application-repl': patch +'@finos/legend-server-showcase': patch +'@finos/legend-query-builder': patch +'@finos/legend-server-depot': patch +'@finos/legend-application': patch +'@finos/legend-server-sdlc': patch +'@finos/legend-dev-utils': patch +'@finos/stylelint-config-legend-studio': patch +'@finos/legend-storage': patch +'@finos/eslint-plugin-legend-studio': patch +'@finos/legend-shared': patch +'@finos/babel-preset-legend-studio': patch +'@finos/legend-graph': patch +'@finos/legend-lego': patch +'@finos/legend-art': patch +--- diff --git a/.changeset/nine-balloons-shout.md b/.changeset/nine-balloons-shout.md new file mode 100644 index 0000000000..a9eed37ee2 --- /dev/null +++ b/.changeset/nine-balloons-shout.md @@ -0,0 +1,38 @@ +--- +'@finos/legend-application-pure-ide-deployment': patch +'@finos/legend-extension-dsl-data-space-studio': patch +'@finos/legend-application-studio-deployment': patch +'@finos/legend-extension-store-service-store': patch +'@finos/legend-vscode-extension-dependencies': patch +'@finos/legend-application-query-deployment': patch +'@finos/legend-application-studio-bootstrap': patch +'@finos/legend-application-query-bootstrap': patch +'@finos/legend-application-repl-deployment': patch +'@finos/legend-extension-store-relational': patch +'@finos/legend-server-showcase-deployment': patch +'@finos/legend-extension-dsl-persistence': patch +'@finos/legend-extension-store-flat-data': patch +'@finos/legend-extension-dsl-data-space': patch +'@finos/legend-extension-tracer-zipkin': patch +'@finos/legend-extension-dsl-diagram': patch +'@finos/legend-extension-dsl-service': patch +'@finos/legend-application-pure-ide': patch +'@finos/legend-extension-assortment': patch +'@finos/legend-application-studio': patch +'@finos/legend-extension-dsl-text': patch +'@finos/legend-application-query': patch +'@finos/legend-application-repl': patch +'@finos/legend-server-showcase': patch +'@finos/legend-query-builder': patch +'@finos/legend-server-depot': patch +'@finos/legend-application': patch +'@finos/legend-server-sdlc': patch +'@finos/legend-dev-utils': patch +'@finos/legend-storage': patch +'@finos/eslint-plugin-legend-studio': patch +'@finos/legend-shared': patch +'@finos/babel-preset-legend-studio': patch +'@finos/legend-graph': patch +'@finos/legend-lego': patch +'@finos/legend-art': patch +--- diff --git a/.changeset/old-walls-punch.md b/.changeset/old-walls-punch.md new file mode 100644 index 0000000000..a9eed37ee2 --- /dev/null +++ b/.changeset/old-walls-punch.md @@ -0,0 +1,38 @@ +--- +'@finos/legend-application-pure-ide-deployment': patch +'@finos/legend-extension-dsl-data-space-studio': patch +'@finos/legend-application-studio-deployment': patch +'@finos/legend-extension-store-service-store': patch +'@finos/legend-vscode-extension-dependencies': patch +'@finos/legend-application-query-deployment': patch +'@finos/legend-application-studio-bootstrap': patch +'@finos/legend-application-query-bootstrap': patch +'@finos/legend-application-repl-deployment': patch +'@finos/legend-extension-store-relational': patch +'@finos/legend-server-showcase-deployment': patch +'@finos/legend-extension-dsl-persistence': patch +'@finos/legend-extension-store-flat-data': patch +'@finos/legend-extension-dsl-data-space': patch +'@finos/legend-extension-tracer-zipkin': patch +'@finos/legend-extension-dsl-diagram': patch +'@finos/legend-extension-dsl-service': patch +'@finos/legend-application-pure-ide': patch +'@finos/legend-extension-assortment': patch +'@finos/legend-application-studio': patch +'@finos/legend-extension-dsl-text': patch +'@finos/legend-application-query': patch +'@finos/legend-application-repl': patch +'@finos/legend-server-showcase': patch +'@finos/legend-query-builder': patch +'@finos/legend-server-depot': patch +'@finos/legend-application': patch +'@finos/legend-server-sdlc': patch +'@finos/legend-dev-utils': patch +'@finos/legend-storage': patch +'@finos/eslint-plugin-legend-studio': patch +'@finos/legend-shared': patch +'@finos/babel-preset-legend-studio': patch +'@finos/legend-graph': patch +'@finos/legend-lego': patch +'@finos/legend-art': patch +--- diff --git a/.changeset/wicked-swans-give.md b/.changeset/wicked-swans-give.md new file mode 100644 index 0000000000..1f800d7a72 --- /dev/null +++ b/.changeset/wicked-swans-give.md @@ -0,0 +1,39 @@ +--- +'@finos/legend-application-pure-ide-deployment': patch +'@finos/legend-extension-dsl-data-space-studio': patch +'@finos/legend-application-studio-deployment': patch +'@finos/legend-extension-store-service-store': patch +'@finos/legend-vscode-extension-dependencies': patch +'@finos/legend-application-query-deployment': patch +'@finos/legend-application-studio-bootstrap': patch +'@finos/legend-application-query-bootstrap': patch +'@finos/legend-application-repl-deployment': patch +'@finos/legend-extension-store-relational': patch +'@finos/legend-server-showcase-deployment': patch +'@finos/legend-extension-dsl-persistence': patch +'@finos/legend-extension-store-flat-data': patch +'@finos/legend-extension-dsl-data-space': patch +'@finos/legend-extension-tracer-zipkin': patch +'@finos/legend-extension-dsl-diagram': patch +'@finos/legend-extension-dsl-service': patch +'@finos/legend-application-pure-ide': patch +'@finos/legend-extension-assortment': patch +'@finos/legend-application-studio': patch +'@finos/legend-extension-dsl-text': patch +'@finos/legend-application-query': patch +'@finos/legend-application-repl': patch +'@finos/legend-server-showcase': patch +'@finos/legend-query-builder': patch +'@finos/legend-server-depot': patch +'@finos/legend-application': patch +'@finos/legend-server-sdlc': patch +'@finos/legend-dev-utils': patch +'@finos/stylelint-config-legend-studio': patch +'@finos/legend-storage': patch +'@finos/eslint-plugin-legend-studio': patch +'@finos/legend-shared': patch +'@finos/babel-preset-legend-studio': patch +'@finos/legend-graph': patch +'@finos/legend-lego': patch +'@finos/legend-art': patch +--- diff --git a/.changeset/young-radios-explain.md b/.changeset/young-radios-explain.md new file mode 100644 index 0000000000..2d3b153f59 --- /dev/null +++ b/.changeset/young-radios-explain.md @@ -0,0 +1,4 @@ +--- +'@finos/legend-application-repl': patch +'@finos/legend-art': patch +--- diff --git a/fixtures/legend-mock-server/package.json b/fixtures/legend-mock-server/package.json index 8983c50a74..e60605b013 100644 --- a/fixtures/legend-mock-server/package.json +++ b/fixtures/legend-mock-server/package.json @@ -35,7 +35,7 @@ "eslint": "8.57.0", "nodemon": "3.1.4", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", - "typescript": "5.5.2" + "rimraf": "5.0.8", + "typescript": "5.5.3" } } diff --git a/package.json b/package.json index d0b5cdad0a..a2df673cd5 100644 --- a/package.json +++ b/package.json @@ -95,32 +95,32 @@ "@actions/core": "1.10.1", "@actions/github": "6.0.0", "@babel/core": "7.24.7", - "@changesets/cli": "2.27.6", + "@changesets/cli": "2.27.7", "@finos/babel-preset-legend-studio": "workspace:*", "@finos/eslint-plugin-legend-studio": "workspace:*", "@finos/legend-dev-utils": "workspace:*", "@finos/stylelint-config-legend-studio": "workspace:*", - "@types/node": "20.14.9", + "@types/node": "20.14.10", "chalk": "5.3.0", "cross-env": "7.0.3", "envinfo": "7.13.0", "eslint": "8.57.0", "fs-extra": "11.2.0", "husky": "9.0.11", - "inquirer": "9.3.2", + "inquirer": "9.3.4", "jest": "29.7.0", "lint-staged": "15.2.7", "micromatch": "4.0.7", "npm-run-all": "4.1.5", "prettier": "3.3.2", "prettier-plugin-tailwindcss": "0.6.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "sass": "1.77.6", "semver": "7.6.2", "sort-package-json": "2.10.0", "stylelint": "16.6.1", "typedoc": "0.26.3", - "typescript": "5.5.2", + "typescript": "5.5.3", "yargs": "17.7.2" }, "packageManager": "yarn@4.2.1", diff --git a/packages/babel-preset/package.json b/packages/babel-preset/package.json index bc9188b029..5fbbd14a69 100644 --- a/packages/babel-preset/package.json +++ b/packages/babel-preset/package.json @@ -41,8 +41,8 @@ "devDependencies": { "cross-env": "7.0.3", "eslint": "8.57.0", - "rimraf": "5.0.7", - "typescript": "5.5.2" + "rimraf": "5.0.8", + "typescript": "5.5.3" }, "peerDependencies": { "@babel/core": "^7.0.0" diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index a7222118af..6e99c201c5 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -32,8 +32,8 @@ "dependencies": { "@babel/core": "7.24.7", "@babel/eslint-parser": "7.24.7", - "@typescript-eslint/eslint-plugin": "7.14.1", - "@typescript-eslint/parser": "7.14.1", + "@typescript-eslint/eslint-plugin": "7.15.0", + "@typescript-eslint/parser": "7.15.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-import": "2.29.1", "eslint-plugin-prettier": "5.1.3", @@ -44,7 +44,7 @@ }, "devDependencies": { "cross-env": "7.0.3", - "rimraf": "5.0.7" + "rimraf": "5.0.8" }, "peerDependencies": { "eslint": "^8.0.0", diff --git a/packages/legend-application-pure-ide-deployment/package.json b/packages/legend-application-pure-ide-deployment/package.json index 1f547d398d..471791606d 100644 --- a/packages/legend-application-pure-ide-deployment/package.json +++ b/packages/legend-application-pure-ide-deployment/package.json @@ -49,8 +49,8 @@ "cross-env": "7.0.3", "eslint": "8.57.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", - "typescript": "5.5.2", + "rimraf": "5.0.8", + "typescript": "5.5.3", "webpack": "5.92.1", "webpack-bundle-analyzer": "4.10.2", "webpack-cli": "5.1.4", diff --git a/packages/legend-application-pure-ide/package.json b/packages/legend-application-pure-ide/package.json index b73e0de1a8..87d2a05321 100644 --- a/packages/legend-application-pure-ide/package.json +++ b/packages/legend-application-pure-ide/package.json @@ -51,7 +51,7 @@ "@finos/legend-shared": "workspace:*", "@types/react": "18.3.3", "@types/react-dom": "18.3.0", - "mobx": "6.12.5", + "mobx": "6.13.0", "mobx-react-lite": "4.0.7", "monaco-editor": "0.50.0", "react": "18.3.1", @@ -66,9 +66,9 @@ "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "sass": "1.77.6", - "typescript": "5.5.2" + "typescript": "5.5.3" }, "peerDependencies": { "react": "^18.0.0" diff --git a/packages/legend-application-query-bootstrap/package.json b/packages/legend-application-query-bootstrap/package.json index 6d42ae4207..6d2daab4b9 100644 --- a/packages/legend-application-query-bootstrap/package.json +++ b/packages/legend-application-query-bootstrap/package.json @@ -66,9 +66,9 @@ "cross-env": "7.0.3", "eslint": "8.57.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "sass": "1.77.6", - "typescript": "5.5.2" + "typescript": "5.5.3" }, "publishConfig": { "directory": "build/publishContent" diff --git a/packages/legend-application-query-deployment/package.json b/packages/legend-application-query-deployment/package.json index a066ce1ddc..c41ea85266 100644 --- a/packages/legend-application-query-deployment/package.json +++ b/packages/legend-application-query-deployment/package.json @@ -42,8 +42,8 @@ "cross-env": "7.0.3", "eslint": "8.57.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", - "typescript": "5.5.2", + "rimraf": "5.0.8", + "typescript": "5.5.3", "webpack": "5.92.1", "webpack-bundle-analyzer": "4.10.2", "webpack-cli": "5.1.4", diff --git a/packages/legend-application-query/package.json b/packages/legend-application-query/package.json index de1b04a232..0afe41f10f 100644 --- a/packages/legend-application-query/package.json +++ b/packages/legend-application-query/package.json @@ -52,11 +52,11 @@ "@finos/legend-server-depot": "workspace:*", "@finos/legend-shared": "workspace:*", "@finos/legend-storage": "workspace:*", - "@testing-library/dom": "10.2.0", + "@testing-library/dom": "10.3.1", "@testing-library/react": "16.0.0", "@types/react": "18.3.3", "@types/react-dom": "18.3.0", - "mobx": "6.12.5", + "mobx": "6.13.0", "mobx-react-lite": "4.0.7", "react": "18.3.1", "react-dom": "18.3.1", @@ -69,9 +69,9 @@ "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "sass": "1.77.6", - "typescript": "5.5.2" + "typescript": "5.5.3" }, "peerDependencies": { "react": "^18.0.0" diff --git a/packages/legend-application-repl-deployment/package.json b/packages/legend-application-repl-deployment/package.json index 004a133874..78de39769d 100644 --- a/packages/legend-application-repl-deployment/package.json +++ b/packages/legend-application-repl-deployment/package.json @@ -50,9 +50,9 @@ "cross-env": "7.0.3", "eslint": "8.57.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "tailwindcss": "3.4.4", - "typescript": "5.5.2", + "typescript": "5.5.3", "webpack": "5.92.1", "webpack-bundle-analyzer": "4.10.2", "webpack-cli": "5.1.4", diff --git a/packages/legend-application-repl/package.json b/packages/legend-application-repl/package.json index fa98aa44b2..2a00fdb281 100644 --- a/packages/legend-application-repl/package.json +++ b/packages/legend-application-repl/package.json @@ -45,16 +45,16 @@ "test:watch": "jest --watch" }, "dependencies": { - "@ag-grid-community/client-side-row-model": "31.3.2", - "@ag-grid-community/core": "31.3.2", - "@ag-grid-community/react": "31.3.2", - "@ag-grid-community/styles": "31.3.2", - "@ag-grid-enterprise/clipboard": "31.3.2", - "@ag-grid-enterprise/core": "31.3.2", - "@ag-grid-enterprise/menu": "31.3.2", - "@ag-grid-enterprise/range-selection": "31.3.2", - "@ag-grid-enterprise/row-grouping": "31.3.2", - "@ag-grid-enterprise/server-side-row-model": "31.3.2", + "@ag-grid-community/client-side-row-model": "32.0.0", + "@ag-grid-community/core": "32.0.0", + "@ag-grid-community/react": "32.0.0", + "@ag-grid-community/styles": "32.0.0", + "@ag-grid-enterprise/clipboard": "32.0.0", + "@ag-grid-enterprise/core": "32.0.0", + "@ag-grid-enterprise/menu": "32.0.0", + "@ag-grid-enterprise/range-selection": "32.0.0", + "@ag-grid-enterprise/row-grouping": "32.0.0", + "@ag-grid-enterprise/server-side-row-model": "32.0.0", "@finos/legend-application": "workspace:*", "@finos/legend-art": "workspace:*", "@finos/legend-graph": "workspace:*", @@ -63,7 +63,7 @@ "@types/react": "18.3.3", "@types/react-dom": "18.3.0", "antlr4": "4.13.1-patch-1", - "mobx": "6.12.5", + "mobx": "6.13.0", "mobx-react-lite": "4.0.7", "monaco-editor": "0.50.0", "react": "18.3.1", @@ -78,9 +78,9 @@ "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "sass": "1.77.6", - "typescript": "5.5.2" + "typescript": "5.5.3" }, "peerDependencies": { "react": "^18.0.0" diff --git a/packages/legend-application-repl/src/components/LegendREPLFrameworkProvider.tsx b/packages/legend-application-repl/src/components/LegendREPLFrameworkProvider.tsx index 651e47bad5..f3ef159eb0 100644 --- a/packages/legend-application-repl/src/components/LegendREPLFrameworkProvider.tsx +++ b/packages/legend-application-repl/src/components/LegendREPLFrameworkProvider.tsx @@ -51,7 +51,7 @@ const LegendREPLBaseStoreProvider: React.FC<{ export const LegendREPLFrameworkProvider: React.FC<{ children: React.ReactNode; }> = ({ children }) => ( - + {children} ); diff --git a/packages/legend-application-repl/src/components/REPLStoreProvider.tsx b/packages/legend-application-repl/src/components/REPLStoreProvider.tsx index a8ac815db8..b353e2eec6 100644 --- a/packages/legend-application-repl/src/components/REPLStoreProvider.tsx +++ b/packages/legend-application-repl/src/components/REPLStoreProvider.tsx @@ -16,7 +16,7 @@ import { createContext, useContext } from 'react'; import { useLocalObservable } from 'mobx-react-lite'; -import { REPLStore } from '../stores/dataCube/REPLStore.js'; +import { REPLStore } from '../stores/REPLStore.js'; import { guaranteeNonNullable } from '@finos/legend-shared'; import { useApplicationStore } from '@finos/legend-application'; import type { LegendREPLApplicationConfig } from '../application/LegendREPLApplicationConfig.js'; diff --git a/packages/legend-application-repl/src/components/REPLWindow.tsx b/packages/legend-application-repl/src/components/REPLWindow.tsx new file mode 100644 index 0000000000..9b1ce5e04f --- /dev/null +++ b/packages/legend-application-repl/src/components/REPLWindow.tsx @@ -0,0 +1,179 @@ +/** + * Copyright (c) 2020-present, Goldman Sachs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { useState } from 'react'; +import { DataCubeIcon, ResizableAndDraggableBox, cn } from '@finos/legend-art'; + +const WINDOW_DEFAULT_OFFSET = 50; +const WINDOW_DEFAULT_WIDTH = 800; +const WINDOW_DEFAULT_HEIGHT = 600; +const WINDOW_DEFAULT_MIN_WIDTH = 300; +const WINDOW_DEFAULT_MIN_HEIGHT = 300; + +export type REPLWindowConfig = { + title: string; + uuid: string; + + x?: number | undefined; + y?: number | undefined; + width?: number | undefined; + height?: number | undefined; + minWidth?: number | undefined; + minHeight?: number | undefined; + center?: boolean | undefined; +}; + +export const REPLWindow = (props: { + containerRef: React.RefObject; + children: React.ReactNode; + config: REPLWindowConfig; + onClose: () => void; +}) => { + const { containerRef, children, onClose, config } = props; + + const [windowSpec, setWindowSpec] = useState(() => { + const x = config.x ?? WINDOW_DEFAULT_OFFSET; + const y = config.y ?? WINDOW_DEFAULT_OFFSET; + const width = config.width ?? WINDOW_DEFAULT_WIDTH; + const height = config.height ?? WINDOW_DEFAULT_HEIGHT; + + if (containerRef.current) { + const { width: containerWidth, height: containerHeight } = + containerRef.current.getBoundingClientRect(); + + if (config.center) { + const finalWidth = + width + WINDOW_DEFAULT_OFFSET * 2 > containerWidth + ? containerWidth - WINDOW_DEFAULT_OFFSET * 2 + : width; + const finalHeight = + height + WINDOW_DEFAULT_OFFSET * 2 > containerHeight + ? containerHeight - WINDOW_DEFAULT_OFFSET * 2 + : height; + return { + x: (containerWidth - finalWidth) / 2, + y: (containerHeight - finalHeight) / 2, + width: finalWidth, + height: finalHeight, + }; + } + + return { + x, + y, + width: + width + x + WINDOW_DEFAULT_OFFSET > containerWidth + ? containerWidth - x - WINDOW_DEFAULT_OFFSET + : width, + height: + height + y + WINDOW_DEFAULT_OFFSET > containerHeight + ? containerHeight - y - WINDOW_DEFAULT_OFFSET + : height, + }; + } + + return { + x, + y, + width, + height, + }; + }); + + return ( + { + setWindowSpec({ ...windowSpec, x: data.x, y: data.y }); + }} + dragHandleClassName={`data-cube__window-${config.uuid}`} + onResize={(event, direction, ref, delta, position) => { + setWindowSpec({ + ...position, + width: ref.offsetWidth, + height: ref.offsetHeight, + }); + }} + enableResizing={{ + top: true, + right: true, + bottom: true, + left: true, + topRight: true, + bottomRight: true, + bottomLeft: true, + topLeft: true, + }} + resizeHandleStyles={{ + top: { cursor: 'ns-resize' }, + right: { cursor: 'ew-resize' }, + bottom: { cursor: 'ns-resize' }, + left: { cursor: 'ew-resize' }, + topRight: { + cursor: 'nesw-resize', + width: 14, + height: 14, + top: -7, + right: -7, + }, + bottomRight: { + cursor: 'nwse-resize', + width: 14, + height: 14, + bottom: -7, + right: -7, + }, + bottomLeft: { + cursor: 'nesw-resize', + width: 14, + height: 14, + bottom: -7, + left: -7, + }, + topLeft: { + cursor: 'nwse-resize', + width: 14, + height: 14, + top: -7, + left: -7, + }, + }} + > +
+
+
{config.title}
+ +
+
{children}
+
+
+ ); +}; diff --git a/packages/legend-application-repl/src/components/dataCube/DataCube.tsx b/packages/legend-application-repl/src/components/dataCube/DataCube.tsx index ab59e70dc6..5902aea554 100644 --- a/packages/legend-application-repl/src/components/dataCube/DataCube.tsx +++ b/packages/legend-application-repl/src/components/dataCube/DataCube.tsx @@ -51,7 +51,7 @@ const DataCubeStatusBar = observer(() => {
- {dataCube.runningTaskes.size > 0 && ( + {dataCube.runningTasks.size > 0 && ( }) => { const { containerRef } = props; - const [windowSpec, setWindowSpec] = useState({ - x: PANEL_DEFAULT_OFFSET, - y: PANEL_DEFAULT_OFFSET, - width: PANEL_DEFAULT_WIDTH, - height: PANEL_DEFAULT_HEIGHT, - }); const replStore = useREPLStore(); const editor = replStore.dataCube.editor; const selectedTab = editor.currentTab; const tabs = [ + DATA_CUBE_EDITOR_TAB.GENERAL_PROPERTIES, + DATA_CUBE_EDITOR_TAB.FILTER, + DATA_CUBE_EDITOR_TAB.EXTENDED_COLUMNS, DATA_CUBE_EDITOR_TAB.COLUMNS, + DATA_CUBE_EDITOR_TAB.COLUMN_PROPERTIES, DATA_CUBE_EDITOR_TAB.VERTICAL_PIVOTS, DATA_CUBE_EDITOR_TAB.HORIZONTAL_PIVOTS, - DATA_CUBE_EDITOR_TAB.EXTENDED_COLUMNS, - DATA_CUBE_EDITOR_TAB.FILTER, DATA_CUBE_EDITOR_TAB.SORTS, - DATA_CUBE_EDITOR_TAB.GENERAL_PROPERTIES, - DATA_CUBE_EDITOR_TAB.COLUMN_PROPERTIES, DATA_CUBE_EDITOR_TAB.CODE, - DATA_CUBE_EDITOR_TAB.DEVELOPER, ]; - useEffect(() => { - if (containerRef.current) { - const { width: containerWidth, height: containerHeight } = - containerRef.current.getBoundingClientRect(); - setWindowSpec({ - x: PANEL_DEFAULT_OFFSET, - y: PANEL_DEFAULT_OFFSET, - width: - PANEL_DEFAULT_WIDTH + PANEL_DEFAULT_OFFSET * 2 > containerWidth - ? containerWidth - PANEL_DEFAULT_OFFSET * 2 - : PANEL_DEFAULT_WIDTH, - height: - PANEL_DEFAULT_HEIGHT + PANEL_DEFAULT_OFFSET * 2 > containerHeight - ? containerHeight - PANEL_DEFAULT_OFFSET * 2 - : PANEL_DEFAULT_HEIGHT, - }); - } - }, [containerRef]); - return ( - { - setWindowSpec({ ...windowSpec, x: data.x, y: data.y }); - }} - dragHandleClassName={__DATA_CUBE_EDITOR_HEADER_CLASS_NAME} - onResize={(event, direction, ref, delta, position) => { - setWindowSpec({ - ...position, - width: ref.offsetWidth, - height: ref.offsetHeight, - }); - }} - enableResizing={{ - top: true, - right: true, - bottom: true, - left: true, - topRight: true, - bottomRight: true, - bottomLeft: true, - topLeft: true, - }} - resizeHandleStyles={{ - top: { cursor: 'ns-resize' }, - right: { cursor: 'ew-resize' }, - bottom: { cursor: 'ns-resize' }, - left: { cursor: 'ew-resize' }, - topRight: { - cursor: 'nesw-resize', - width: 14, - height: 14, - top: -7, - right: -7, - }, - bottomRight: { - cursor: 'nwse-resize', - width: 14, - height: 14, - bottom: -7, - right: -7, - }, - bottomLeft: { - cursor: 'nesw-resize', - width: 14, - height: 14, - bottom: -7, - left: -7, - }, - topLeft: { - cursor: 'nwse-resize', - width: 14, - height: 14, - top: -7, - left: -7, - }, - }} + editor.closePanel()} > -
-
-
Properties
- -
-
-
- {tabs.map((tab) => ( - - ))} -
-
- {selectedTab === DATA_CUBE_EDITOR_TAB.COLUMNS && ( - - )} - {selectedTab === DATA_CUBE_EDITOR_TAB.SORTS && ( - - )} - {selectedTab === DATA_CUBE_EDITOR_TAB.VERTICAL_PIVOTS && ( - - )} - {selectedTab === DATA_CUBE_EDITOR_TAB.HORIZONTAL_PIVOTS && ( - - )} - {selectedTab === DATA_CUBE_EDITOR_TAB.EXTENDED_COLUMNS && ( - - )} - {selectedTab === DATA_CUBE_EDITOR_TAB.FILTER && ( - - )} - {selectedTab === DATA_CUBE_EDITOR_TAB.GENERAL_PROPERTIES && ( - - )} - {selectedTab === DATA_CUBE_EDITOR_TAB.COLUMN_PROPERTIES && ( - - )} - {selectedTab === DATA_CUBE_EDITOR_TAB.CODE && ( - - )} - {selectedTab === DATA_CUBE_EDITOR_TAB.DEVELOPER && ( - - )} -
+
+
+ {tabs.map((tab) => ( + + ))}
-
- - - +
+ {selectedTab === DATA_CUBE_EDITOR_TAB.COLUMNS && ( + + )} + {selectedTab === DATA_CUBE_EDITOR_TAB.SORTS && ( + + )} + {selectedTab === DATA_CUBE_EDITOR_TAB.VERTICAL_PIVOTS && ( + + )} + {selectedTab === DATA_CUBE_EDITOR_TAB.HORIZONTAL_PIVOTS && ( + + )} + {selectedTab === DATA_CUBE_EDITOR_TAB.EXTENDED_COLUMNS && ( + + )} + {selectedTab === DATA_CUBE_EDITOR_TAB.FILTER && ( + + )} + {selectedTab === DATA_CUBE_EDITOR_TAB.GENERAL_PROPERTIES && ( + + )} + {selectedTab === DATA_CUBE_EDITOR_TAB.COLUMN_PROPERTIES && ( + + )} + {selectedTab === DATA_CUBE_EDITOR_TAB.CODE && ( + + )}
- +
+ + + +
+ ); }, ); diff --git a/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorCodePanel.tsx b/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorCodePanel.tsx index 66607b384f..494606d536 100644 --- a/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorCodePanel.tsx +++ b/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorCodePanel.tsx @@ -18,6 +18,7 @@ import { observer } from 'mobx-react-lite'; import { DataCubeIcon } from '@finos/legend-art'; import { useEffect } from 'react'; import { useREPLStore } from '../../REPLStoreProvider.js'; +import { WIP_Badge } from './DataCubeEditorShared.js'; // const DataCubeCodeEditor = observer(() => { // const replStore = useREPLStore(); @@ -143,7 +144,7 @@ import { useREPLStore } from '../../REPLStoreProvider.js'; export const DataCubeEditorCodePanel = observer(() => { const replStore = useREPLStore(); - const panel = replStore.dataCube.editor.sortsPanel; + const panel = replStore.dataCube.editor.sorts; // const executeLambda = (): void => { // // TODO: @akphi // // flowResult(dataCubeState.executeLambda()).catch( @@ -161,6 +162,7 @@ export const DataCubeEditorCodePanel = observer(() => {
Code +
diff --git a/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorColumnPropertiesPanel.tsx b/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorColumnPropertiesPanel.tsx index f3445de141..52085ef5ff 100644 --- a/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorColumnPropertiesPanel.tsx +++ b/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorColumnPropertiesPanel.tsx @@ -18,6 +18,7 @@ import { cn, DataCubeIcon, useDropdownMenu } from '@finos/legend-art'; import { observer } from 'mobx-react-lite'; import { useREPLStore } from '../../REPLStoreProvider.js'; import { + Advanced_Badge, DataCubeEditorCheckbox, DataCubeEditorColorPickerButton, DataCubeEditorDropdownMenu, @@ -31,28 +32,29 @@ import { import { DataCubeAggregateFunction, DataCubeColumnDataType, + DataCubeColumnKind, DataCubeColumnPinPlacement, DataCubeFont, - DataCubeFontFormatUnderlinedVariant, + DataCubeFontCase, + DataCubeFontFormatUnderlineVariant, DataCubeFontTextAlignment, DataCubeNumberScale, - DEFAULT_BACKGROUND_COLOR, DEFAULT_COLUMN_MAX_WIDTH, DEFAULT_COLUMN_MIN_WIDTH, DEFAULT_COLUMN_WIDTH, - DEFAULT_ERROR_FOREGROUND_COLOR, - DEFAULT_FOREGROUND_COLOR, - DEFAULT_NEGATIVE_FOREGROUND_COLOR, - DEFAULT_ZERO_FOREGROUND_COLOR, + DEFAULT_URL_LABEL_QUERY_PARAM, } from '../../../stores/dataCube/core/DataCubeQueryEngine.js'; export const DataCubeEditorColumnPropertiesPanel = observer(() => { const replStore = useREPLStore(); const dataCube = replStore.dataCube; - const panel = dataCube.editor.columnPropertiesPanel; + const panel = dataCube.editor.columnProperties; + const gridConfiguration = dataCube.editor.generalProperties.configuration; const selectedColumn = panel.selectedColumn; const [openColumnsDropdown, closeColumnsDropdown, columnsDropdownProps] = useDropdownMenu(); + const [openKindDropdown, closeKindDropdown, kindDropdownProps] = + useDropdownMenu(); const [ openAggregationTypeDropdown, closeAggregationTypeDropdown, @@ -74,25 +76,39 @@ export const DataCubeEditorColumnPropertiesPanel = observer(() => { openFontSizeDropdownProps, ] = useDropdownMenu(); const [ - openFontFormatUnderlinedVariantDropdown, - closeFontFormatUnderlinedVariantDropdown, - fontFormatUnderlinedVariantDropdownProps, + openFontFormatUnderlineVariantDropdown, + closeFontFormatUnderlineVariantDropdown, + fontFormatUnderlineVariantDropdownProps, ] = useDropdownMenu(); const [ openColumnPinDropdown, closeColumnPinDropdown, columnPinDropdownProps, ] = useDropdownMenu(); + const [openFontCaseDropdown, closeFontCaseDropdown, fontCaseDropdownProps] = + useDropdownMenu(); return (
-
-
- - +
+
+
+ + +
+
+ Column Properties +
-
- Column Properties +
+ + panel.setShowAdvancedSettings(!panel.showAdvancedSettings) + } + /> +
@@ -105,7 +121,16 @@ export const DataCubeEditorColumnPropertiesPanel = observer(() => { className="w-80" onClick={openColumnsDropdown} > - {selectedColumn?.name ?? '(None)'} +
+
+ {selectedColumn?.name ?? '(None)'} +
+ {selectedColumn && ( +
+ {selectedColumn.dataType} +
+ )} +
{ closeColumnsDropdown(); }} > - {column.name} +
+ {column.name} +
+
+ {column.dataType} +
))}
- {selectedColumn && ( - // TODO: if this is an extended column, show the info and link it - // e.g. `Extended Column (Leaf)`, `Extended Column (Group)` - // with arrow button to go to the extended column editor + {panel.showAdvancedSettings && selectedColumn && ( <> -
-
-
- {selectedColumn.dataType} +
+
+
+ Kind:
-
+ {selectedColumn.kind} -
+ + + {[ + DataCubeColumnKind.DIMENSION, + DataCubeColumnKind.MEASURE, + ].map((kind) => ( + { + selectedColumn.setKind(kind); + closeKindDropdown(); + }} + > + {kind} + + ))} + + +
)} @@ -145,7 +197,7 @@ export const DataCubeEditorColumnPropertiesPanel = observer(() => { {selectedColumn && ( <> -
+
Display Name:
@@ -163,7 +215,7 @@ export const DataCubeEditorColumnPropertiesPanel = observer(() => { {selectedColumn.dataType === DataCubeColumnDataType.NUMBER && ( <> -
+
Number Format:
@@ -201,7 +253,7 @@ export const DataCubeEditorColumnPropertiesPanel = observer(() => { />
-
+
Number Scale:
@@ -222,6 +274,7 @@ export const DataCubeEditorColumnPropertiesPanel = observer(() => { DataCubeNumberScale.THOUSANDS, DataCubeNumberScale.MILLIONS, DataCubeNumberScale.BILLIONS, + DataCubeNumberScale.TRILLIONS, DataCubeNumberScale.AUTO, ].map((scale) => ( {
-
+
Aggregation Type:
@@ -271,20 +324,9 @@ export const DataCubeEditorColumnPropertiesPanel = observer(() => { ))} -
-
- Weight Column: -
- - {selectedColumn.weightColumn ?? '(None)'} - -
-
+
Exclude from HPivot?
@@ -304,7 +346,7 @@ export const DataCubeEditorColumnPropertiesPanel = observer(() => { {selectedColumn.dataType === DataCubeColumnDataType.TEXT && ( <> -
+
Dislay as Link?
@@ -316,13 +358,194 @@ export const DataCubeEditorColumnPropertiesPanel = observer(() => { ) } /> +
+
+ Use Parameter in Link as Label: +
+ { + const value = event.target.value.trim(); + selectedColumn.setLinkLabelParameter( + value !== '' ? value : undefined, + ); + }} + />
)} +
+
+ Visibility: +
+ selectedColumn.setBlur(!selectedColumn.blur)} + disabled={selectedColumn.hideFromView} + /> + + selectedColumn.setHideFromView(!selectedColumn.hideFromView) + } + disabled={true} + /> + +
+ +
+
+ Pin: +
+ + {selectedColumn.pinned ?? '(None)'} + + + {[ + undefined, + DataCubeColumnPinPlacement.LEFT, + DataCubeColumnPinPlacement.RIGHT, + ].map((placement) => ( + { + selectedColumn.setPinned(placement); + closeColumnPinDropdown(); + }} + > + {placement ?? '(None)'} + + ))} + +
+ +
+
+ Width: +
+ { + if ( + selectedColumn.fixedWidth === undefined && + selectedColumn.minWidth === undefined && + selectedColumn.maxWidth === undefined + ) { + selectedColumn.setFixedWidth(DEFAULT_COLUMN_WIDTH); + selectedColumn.setMinWidth(undefined); + selectedColumn.setMaxWidth(undefined); + } else { + selectedColumn.setFixedWidth(undefined); + selectedColumn.setMinWidth(undefined); + selectedColumn.setMaxWidth(undefined); + } + }} + /> + + { + selectedColumn.setFixedWidth( + selectedColumn.fixedWidth !== undefined + ? undefined + : DEFAULT_COLUMN_WIDTH, + ); + selectedColumn.setMinWidth(undefined); + selectedColumn.setMaxWidth(undefined); + }} + /> +
+ value !== undefined && value > 0} + value={selectedColumn.fixedWidth} + setValue={(value) => { + selectedColumn.setFixedWidth(value); + }} + disabled={ + selectedColumn.minWidth !== undefined || + selectedColumn.maxWidth !== undefined + } + /> + + { + if ( + selectedColumn.minWidth === undefined && + selectedColumn.maxWidth === undefined + ) { + selectedColumn.setMinWidth(DEFAULT_COLUMN_MIN_WIDTH); + selectedColumn.setMaxWidth(DEFAULT_COLUMN_MAX_WIDTH); + selectedColumn.setFixedWidth(undefined); + } else { + selectedColumn.setMinWidth(undefined); + selectedColumn.setMaxWidth(undefined); + selectedColumn.setFixedWidth(undefined); + } + }} + /> +
+ value !== undefined && value > 0} + value={selectedColumn.minWidth} + setValue={(value) => { + selectedColumn.setMinWidth(value); + }} + disabled={selectedColumn.fixedWidth !== undefined} + /> +
+ + value !== undefined && + value >= (selectedColumn.minWidth ?? 0) + } + value={selectedColumn.maxWidth} + setValue={(value) => { + selectedColumn.setMaxWidth(value); + }} + disabled={selectedColumn.fixedWidth !== undefined} + /> +
+
-
+
Font:
@@ -330,7 +553,7 @@ export const DataCubeEditorColumnPropertiesPanel = observer(() => { className="w-28" onClick={openFontFamilyDropdown} > - {selectedColumn.fontFamily} + {selectedColumn.fontFamily ?? gridConfiguration.fontFamily} { className="ml-1 w-10" onClick={openFontSizeDropdown} > - {selectedColumn.fontSize} + {selectedColumn.fontSize ?? gridConfiguration.fontSize} { className={cn( 'relative flex h-5 w-5 items-center justify-center rounded-bl-sm rounded-tl-sm border border-neutral-400 bg-neutral-50 p-0 text-neutral-700 focus-visible:z-[1]', { - 'bg-neutral-200': selectedColumn.fontBold, + 'bg-neutral-200': + selectedColumn.fontBold ?? gridConfiguration.fontBold, }, )} onClick={() => - selectedColumn.setFontBold(!selectedColumn.fontBold) + selectedColumn.setFontBold( + !( + selectedColumn.fontBold ?? gridConfiguration.fontBold + ), + ) } > @@ -431,57 +659,79 @@ export const DataCubeEditorColumnPropertiesPanel = observer(() => { className={cn( 'relative -ml-[1px] flex h-5 w-5 items-center justify-center border border-neutral-400 bg-neutral-50 p-0 text-neutral-700 focus-visible:z-[1]', { - 'bg-neutral-200': selectedColumn.fontItalic, + 'bg-neutral-200': + selectedColumn.fontItalic ?? + gridConfiguration.fontItalic, }, )} onClick={() => - selectedColumn.setFontItalic(!selectedColumn.fontItalic) + selectedColumn.setFontItalic( + !( + selectedColumn.fontItalic ?? + gridConfiguration.fontItalic + ), + ) } > {[ - DataCubeFontFormatUnderlinedVariant.SOLID, - DataCubeFontFormatUnderlinedVariant.DASHED, - DataCubeFontFormatUnderlinedVariant.DOTTED, - DataCubeFontFormatUnderlinedVariant.DOUBLE, - DataCubeFontFormatUnderlinedVariant.WAVY, + DataCubeFontFormatUnderlineVariant.SOLID, + DataCubeFontFormatUnderlineVariant.DASHED, + DataCubeFontFormatUnderlineVariant.DOTTED, + DataCubeFontFormatUnderlineVariant.DOUBLE, + DataCubeFontFormatUnderlineVariant.WAVY, ].map((variant) => ( { - selectedColumn.setFontUnderlined(variant); - closeFontFormatUnderlinedVariantDropdown(); + selectedColumn.setFontUnderline(variant); + selectedColumn.setFontStrikethrough(false); + closeFontFormatUnderlineVariantDropdown(); }} >
{ { '!hover:decoration-solid !decoration-solid': variant === - DataCubeFontFormatUnderlinedVariant.SOLID, + DataCubeFontFormatUnderlineVariant.SOLID, '!hover:decoration-dashed !decoration-dashed': variant === - DataCubeFontFormatUnderlinedVariant.DASHED, + DataCubeFontFormatUnderlineVariant.DASHED, '!hover:decoration-dotted !decoration-dotted': variant === - DataCubeFontFormatUnderlinedVariant.DOTTED, + DataCubeFontFormatUnderlineVariant.DOTTED, '!hover:decoration-double !decoration-double': variant === - DataCubeFontFormatUnderlinedVariant.DOUBLE, + DataCubeFontFormatUnderlineVariant.DOUBLE, '!hover:decoration-wavy !decoration-wavy': variant === - DataCubeFontFormatUnderlinedVariant.WAVY, + DataCubeFontFormatUnderlineVariant.WAVY, 'text-sky-600': - variant === selectedColumn.fontUnderlined, + variant === + (selectedColumn.fontUnderline ?? + gridConfiguration.fontUnderline), }, )} > @@ -516,19 +768,97 @@ export const DataCubeEditorColumnPropertiesPanel = observer(() => { + + + + {[ + DataCubeFontCase.LOWERCASE, + DataCubeFontCase.UPPERCASE, + DataCubeFontCase.CAPITALIZE, + ].map((fontCase) => ( + { + selectedColumn.setFontCase(fontCase); + closeFontCaseDropdown(); + }} + > +
+ {fontCase} +
+
+ ))} +
@@ -538,7 +868,8 @@ export const DataCubeEditorColumnPropertiesPanel = observer(() => { 'relative flex h-5 w-5 items-center justify-center rounded-bl-sm rounded-tl-sm border border-neutral-400 bg-neutral-50 p-0 text-neutral-700 focus-visible:z-[1]', { 'bg-neutral-200': - selectedColumn.textAlign === + (selectedColumn.textAlign ?? + gridConfiguration.textAlign) === DataCubeFontTextAlignment.LEFT, }, )} @@ -556,7 +887,8 @@ export const DataCubeEditorColumnPropertiesPanel = observer(() => { 'relative -ml-[1px] flex h-5 w-5 items-center justify-center border border-neutral-400 bg-neutral-50 p-0 text-neutral-700 focus-visible:z-[1]', { 'bg-neutral-200': - selectedColumn.textAlign === + (selectedColumn.textAlign ?? + gridConfiguration.textAlign) === DataCubeFontTextAlignment.CENTER, }, )} @@ -574,7 +906,8 @@ export const DataCubeEditorColumnPropertiesPanel = observer(() => { 'relative -ml-[1px] flex h-5 w-5 items-center justify-center rounded-br-sm rounded-tr-sm border border-neutral-400 bg-neutral-50 p-0 text-neutral-700 focus-visible:z-[1]', { 'bg-neutral-200': - selectedColumn.textAlign === + (selectedColumn.textAlign ?? + gridConfiguration.textAlign) === DataCubeFontTextAlignment.RIGHT, }, )} @@ -615,37 +948,49 @@ export const DataCubeEditorColumnPropertiesPanel = observer(() => {
- selectedColumn.setForegroundColor(value) + selectedColumn.setNormalForegroundColor(value) } />
- selectedColumn.setForegroundNegativeColor(value) + selectedColumn.setNegativeForegroundColor(value) } />
- selectedColumn.setForegroundZeroColor(value) + selectedColumn.setZeroForegroundColor(value) } />
- selectedColumn.setForegroundErrorColor(value) + selectedColumn.setErrorForegroundColor(value) } />
@@ -656,37 +1001,49 @@ export const DataCubeEditorColumnPropertiesPanel = observer(() => {
- selectedColumn.setBackgroundColor(value) + selectedColumn.setNormalBackgroundColor(value) } />
- selectedColumn.setBackgroundNegativeColor(value) + selectedColumn.setNegativeBackgroundColor(value) } />
- selectedColumn.setBackgroundZeroColor(value) + selectedColumn.setZeroBackgroundColor(value) } />
- selectedColumn.setBackgroundErrorColor(value) + selectedColumn.setErrorBackgroundColor(value) } />
@@ -694,174 +1051,18 @@ export const DataCubeEditorColumnPropertiesPanel = observer(() => {
-
-
- Hide from View? -
- - selectedColumn.setHideFromView(!selectedColumn.hideFromView) - } - disabled={true} - /> - -
- -
-
- Pin: -
- - {selectedColumn.pinned ?? '(None)'} - - - {[ - undefined, - DataCubeColumnPinPlacement.LEFT, - DataCubeColumnPinPlacement.RIGHT, - ].map((placement) => ( - { - selectedColumn.setPinned(placement); - closeColumnPinDropdown(); - }} - > - {placement ?? '(None)'} - - ))} - -
- -
-
- Width: -
- { - if ( - selectedColumn.fixedWidth === undefined && - selectedColumn.minWidth === undefined && - selectedColumn.maxWidth === undefined - ) { - selectedColumn.setFixedWidth(DEFAULT_COLUMN_WIDTH); - selectedColumn.setMinWidth(undefined); - selectedColumn.setMaxWidth(undefined); - } else { - selectedColumn.setFixedWidth(undefined); - selectedColumn.setMinWidth(undefined); - selectedColumn.setMaxWidth(undefined); - } - }} - /> - - { - selectedColumn.setFixedWidth( - selectedColumn.fixedWidth !== undefined - ? undefined - : DEFAULT_COLUMN_WIDTH, - ); - selectedColumn.setMinWidth(undefined); - selectedColumn.setMaxWidth(undefined); - }} - /> -
- value !== undefined && value > 0} - value={selectedColumn.fixedWidth} - setValue={(value) => { - selectedColumn.setFixedWidth(value); - }} - disabled={ - selectedColumn.minWidth !== undefined || - selectedColumn.maxWidth !== undefined - } - /> - - { - if ( - selectedColumn.minWidth === undefined && - selectedColumn.maxWidth === undefined - ) { - selectedColumn.setMinWidth(DEFAULT_COLUMN_MIN_WIDTH); - selectedColumn.setMaxWidth(DEFAULT_COLUMN_MAX_WIDTH); - selectedColumn.setFixedWidth(undefined); - } else { - selectedColumn.setMinWidth(undefined); - selectedColumn.setMaxWidth(undefined); - selectedColumn.setFixedWidth(undefined); - } - }} - /> -
- value !== undefined && value > 0} - value={selectedColumn.minWidth} - setValue={(value) => { - selectedColumn.setMinWidth(value); - }} - disabled={selectedColumn.fixedWidth !== undefined} - /> -
- - value !== undefined && - value >= (selectedColumn.minWidth ?? 0) - } - value={selectedColumn.maxWidth} - setValue={(value) => { - selectedColumn.setMaxWidth(value); - }} - disabled={selectedColumn.fixedWidth !== undefined} - /> -
- -
-
- Blur Content? +
+
+
+
+
- selectedColumn.setBlur(!selectedColumn.blur)} - disabled={true} - /> -
)} diff --git a/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorColumnsPanel.tsx b/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorColumnsPanel.tsx index 8bc57afd5f..432bc83e2c 100644 --- a/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorColumnsPanel.tsx +++ b/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorColumnsPanel.tsx @@ -21,7 +21,7 @@ import { useEffect } from 'react'; export const DataCubeEditorColumnsPanel = observer(() => { const replStore = useREPLStore(); - const panel = replStore.dataCube.editor.sortsPanel; + const panel = replStore.dataCube.editor.sorts; useEffect(() => {}, [panel]); // TODO: @akphi - remove this dummy useEffect diff --git a/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorColumnsSelector.tsx b/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorColumnsSelector.tsx index a8ef07503a..c66331300c 100644 --- a/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorColumnsSelector.tsx +++ b/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorColumnsSelector.tsx @@ -59,7 +59,6 @@ function getBaseGridProps< rowHeight: 20, headerHeight: 20, suppressRowHoverHighlight: false, - reactiveCustomComponents: true, // TODO: remove on v32 as this would be default to `true` then noRowsOverlayComponent: ( params: CustomNoRowsOverlayProps & { violationSeverity?: 'warning' | 'error' | undefined; diff --git a/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorDeveloperPanel.tsx b/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorDeveloperPanel.tsx index 418fb88558..6a9aef4b7f 100644 --- a/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorDeveloperPanel.tsx +++ b/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorDeveloperPanel.tsx @@ -18,10 +18,11 @@ import { DataCubeIcon } from '@finos/legend-art'; import { observer } from 'mobx-react-lite'; import { useREPLStore } from '../../REPLStoreProvider.js'; import { useEffect } from 'react'; +import { WIP_Badge } from './DataCubeEditorShared.js'; export const DataCubeEditorDeveloperPanel = observer(() => { const replStore = useREPLStore(); - const panel = replStore.dataCube.editor.sortsPanel; + const panel = replStore.dataCube.editor.sorts; useEffect(() => {}, [panel]); // TODO: @akphi - remove this dummy useEffect @@ -33,6 +34,7 @@ export const DataCubeEditorDeveloperPanel = observer(() => {
Developer +
diff --git a/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorExtendedColumnsPanel.tsx b/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorExtendedColumnsPanel.tsx index 658cd90a61..96377e589a 100644 --- a/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorExtendedColumnsPanel.tsx +++ b/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorExtendedColumnsPanel.tsx @@ -18,10 +18,11 @@ import { DataCubeIcon } from '@finos/legend-art'; import { observer } from 'mobx-react-lite'; import { useREPLStore } from '../../REPLStoreProvider.js'; import { useEffect } from 'react'; +import { WIP_Badge } from './DataCubeEditorShared.js'; export const DataCubeEditorExtendedColumnsPanel = observer(() => { const replStore = useREPLStore(); - const panel = replStore.dataCube.editor.sortsPanel; + const panel = replStore.dataCube.editor.sorts; useEffect(() => {}, [panel]); // TODO: @akphi - remove this dummy useEffect @@ -33,6 +34,7 @@ export const DataCubeEditorExtendedColumnsPanel = observer(() => {
Extended Columns +
diff --git a/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorFilterPanel.tsx b/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorFilterPanel.tsx index 822e5d4812..5554f46fb0 100644 --- a/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorFilterPanel.tsx +++ b/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorFilterPanel.tsx @@ -18,10 +18,11 @@ import { DataCubeIcon } from '@finos/legend-art'; import { observer } from 'mobx-react-lite'; import { useREPLStore } from '../../REPLStoreProvider.js'; import { useEffect } from 'react'; +import { WIP_Badge } from './DataCubeEditorShared.js'; export const DataCubeEditorFilterPanel = observer(() => { const replStore = useREPLStore(); - const panel = replStore.dataCube.editor.sortsPanel; + const panel = replStore.dataCube.editor.sorts; useEffect(() => {}, [panel]); // TODO: @akphi - remove this dummy useEffect @@ -33,6 +34,7 @@ export const DataCubeEditorFilterPanel = observer(() => {
Filter +
diff --git a/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorGeneralPropertiesPanel.tsx b/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorGeneralPropertiesPanel.tsx index 0c9ba467ce..cce83c92c3 100644 --- a/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorGeneralPropertiesPanel.tsx +++ b/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorGeneralPropertiesPanel.tsx @@ -19,13 +19,14 @@ import { useREPLStore } from '../../REPLStoreProvider.js'; import { cn, DataCubeIcon, useDropdownMenu } from '@finos/legend-art'; import { DataCubeFont, - DataCubeFontFormatUnderlinedVariant, + DataCubeFontCase, + DataCubeFontFormatUnderlineVariant, DataCubeFontTextAlignment, - DataCubeNumberScale, DataCubeSelectionStat, DEFAULT_BACKGROUND_COLOR, DEFAULT_ERROR_FOREGROUND_COLOR, DEFAULT_FOREGROUND_COLOR, + DEFAULT_GRID_LINE_COLOR, DEFAULT_NEGATIVE_FOREGROUND_COLOR, DEFAULT_ROW_HIGHLIGHT_BACKGROUND_COLOR, DEFAULT_ZERO_FOREGROUND_COLOR, @@ -44,18 +45,13 @@ import { export const DataCubeEditorGeneralPropertiesPanel = observer(() => { const replStore = useREPLStore(); - const panel = replStore.dataCube.editor.generalPropertiesPanel; + const panel = replStore.dataCube.editor.generalProperties; const configuration = panel.configuration; const [ openInitialExpandLevelDropdown, closeInitialExpandLevelDropdown, initialExpandLevelDropdownProps, ] = useDropdownMenu(); - const [ - openNumberScaleDropdown, - closeNumberScaleDropdown, - numberScaleDropdownProps, - ] = useDropdownMenu(); const [ openSelectionStatDropdown, closeSelectionStatDropdown, @@ -72,10 +68,12 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(() => { openFontSizeDropdownProps, ] = useDropdownMenu(); const [ - openFontFormatUnderlinedVariantDropdown, - closeFontFormatUnderlinedVariantDropdown, - fontFormatUnderlinedVariantDropdownProps, + openFontFormatUnderlineVariantDropdown, + closeFontFormatUnderlineVariantDropdown, + fontFormatUnderlineVariantDropdownProps, ] = useDropdownMenu(); + const [openFontCaseDropdown, closeFontCaseDropdown, fontCaseDropdownProps] = + useDropdownMenu(); return (
@@ -94,7 +92,7 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(() => { Report Title:
{ panel.setName(event.target.value); @@ -102,7 +100,7 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(() => { />
-
+
Initially Expand to Level:
@@ -132,7 +130,7 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(() => {
-
+
Show Root Aggregation?
@@ -148,7 +146,7 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(() => {
-
+
Show Leaf Count?
@@ -157,79 +155,54 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(() => { onChange={() => configuration.setShowLeafCount(!configuration.showLeafCount) } + disabled={true} /> +
-
+
Show Lines?
- configuration.setShowTreeLine(!configuration.showTreeLine) + configuration.setShowTreeLines(!configuration.showTreeLines) } + disabled={true} /> + - configuration.setShowHorizontalGridLine( - !configuration.showHorizontalGridLine, + configuration.setShowHorizontalGridLines( + !configuration.showHorizontalGridLines, ) } /> - configuration.setShowVerticalGridLine( - !configuration.showVerticalGridLine, + configuration.setShowVerticalGridLines( + !configuration.showVerticalGridLines, ) } /> +
+ configuration.setGridLineColor(value)} + />
-
-
- Default Number Scale: -
- - {configuration.numberScale ?? '(None)'} - - - {[ - undefined, - DataCubeNumberScale.PERCENT, - DataCubeNumberScale.BASIS_POINT, - DataCubeNumberScale.THOUSANDS, - DataCubeNumberScale.MILLIONS, - DataCubeNumberScale.BILLIONS, - DataCubeNumberScale.AUTO, - ].map((scale) => ( - { - configuration.setNumberScale(scale); - closeNumberScaleDropdown(); - }} - > - {scale ?? '(None)'} - - ))} - -
- -
+
Show Selection Stats:
@@ -263,13 +236,12 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(() => {
-
+
Row Limit:
{
-
+
{ />
+
+
+ Hightlight Rows: +
+ { + if (configuration.alternateRowsStandardMode) { + configuration.setAlternateRowsStandardMode(false); + } else { + configuration.setAlternateRowsStandardMode(true); + configuration.setAlternateRows(false); + } + }} + /> + { + if (configuration.alternateRows) { + configuration.setAlternateRows(false); + } else { + configuration.setAlternateRows(true); + configuration.setAlternateRowsStandardMode(false); + } + }} + /> + value !== undefined && value > 0} + value={configuration.alternateRowsCount} + setValue={(value) => + configuration.setAlternateRowsCount(value ?? 1) + } + /> +
{`row(s)`}
+ configuration.setAlternateRowsColor(value)} + /> +
+
-
+
Default Font:
@@ -308,7 +331,7 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(() => { className="w-28" onClick={openFontFamilyDropdown} > - {configuration.defaultFontFamily} + {configuration.fontFamily} { { - configuration.setDefaultFontFamily(font); + configuration.setFontFamily(font); closeFontFamilyDropdown(); }} > @@ -338,7 +361,7 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(() => { { - configuration.setDefaultFontFamily(font); + configuration.setFontFamily(font); closeFontFamilyDropdown(); }} > @@ -354,7 +377,7 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(() => { { - configuration.setDefaultFontFamily(font); + configuration.setFontFamily(font); closeFontFamilyDropdown(); }} > @@ -367,7 +390,7 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(() => { className="ml-1 w-10" onClick={openFontSizeDropdown} > - {configuration.defaultFontSize} + {configuration.fontSize} { { - configuration.setDefaultFontSize(size); + configuration.setFontSize(size); closeFontSizeDropdown(); }} > @@ -395,13 +418,11 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(() => { className={cn( 'relative flex h-5 w-5 items-center justify-center rounded-bl-sm rounded-tl-sm border border-neutral-400 bg-neutral-50 p-0 text-neutral-700 focus-visible:z-[1]', { - 'bg-neutral-200': configuration.defaultFontBold, + 'bg-neutral-200': configuration.fontBold, }, )} onClick={() => - configuration.setDefaultFontBold( - !configuration.defaultFontBold, - ) + configuration.setFontBold(!configuration.fontBold) } > @@ -411,59 +432,65 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(() => { className={cn( 'relative -ml-[1px] flex h-5 w-5 items-center justify-center border border-neutral-400 bg-neutral-50 p-0 text-neutral-700 focus-visible:z-[1]', { - 'bg-neutral-200': configuration.defaultFontItalic, + 'bg-neutral-200': configuration.fontItalic, }, )} onClick={() => - configuration.setDefaultFontItalic( - !configuration.defaultFontItalic, - ) + configuration.setFontItalic(!configuration.fontItalic) } > {[ - DataCubeFontFormatUnderlinedVariant.SOLID, - DataCubeFontFormatUnderlinedVariant.DASHED, - DataCubeFontFormatUnderlinedVariant.DOTTED, - DataCubeFontFormatUnderlinedVariant.DOUBLE, - DataCubeFontFormatUnderlinedVariant.WAVY, + DataCubeFontFormatUnderlineVariant.SOLID, + DataCubeFontFormatUnderlineVariant.DASHED, + DataCubeFontFormatUnderlineVariant.DOTTED, + DataCubeFontFormatUnderlineVariant.DOUBLE, + DataCubeFontFormatUnderlineVariant.WAVY, ].map((variant) => ( { - configuration.setDefaultFontUnderlined(variant); - closeFontFormatUnderlinedVariantDropdown(); + configuration.setFontUnderline(variant); + configuration.setFontStrikethrough(false); + closeFontFormatUnderlineVariantDropdown(); }} >
{ { '!hover:decoration-solid !decoration-solid': variant === - DataCubeFontFormatUnderlinedVariant.SOLID, + DataCubeFontFormatUnderlineVariant.SOLID, '!hover:decoration-dashed !decoration-dashed': variant === - DataCubeFontFormatUnderlinedVariant.DASHED, + DataCubeFontFormatUnderlineVariant.DASHED, '!hover:decoration-dotted !decoration-dotted': variant === - DataCubeFontFormatUnderlinedVariant.DOTTED, + DataCubeFontFormatUnderlineVariant.DOTTED, '!hover:decoration-double !decoration-double': variant === - DataCubeFontFormatUnderlinedVariant.DOUBLE, + DataCubeFontFormatUnderlineVariant.DOUBLE, '!hover:decoration-wavy !decoration-wavy': - variant === - DataCubeFontFormatUnderlinedVariant.WAVY, + variant === DataCubeFontFormatUnderlineVariant.WAVY, 'text-sky-600': - variant === configuration.defaultFontUnderlined, + variant === configuration.fontUnderline, }, )} > @@ -498,19 +524,81 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(() => { + + + + {[ + DataCubeFontCase.LOWERCASE, + DataCubeFontCase.UPPERCASE, + DataCubeFontCase.CAPITALIZE, + ].map((fontCase) => ( + { + configuration.setFontCase(fontCase); + closeFontCaseDropdown(); + }} + > +
+ {fontCase} +
+
+ ))} +
@@ -520,14 +608,12 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(() => { 'relative flex h-5 w-5 items-center justify-center rounded-bl-sm rounded-tl-sm border border-neutral-400 bg-neutral-50 p-0 text-neutral-700 focus-visible:z-[1]', { 'bg-neutral-200': - configuration.defaultTextAlign === + configuration.textAlign === DataCubeFontTextAlignment.LEFT, }, )} onClick={() => - configuration.setDefaultTextAlign( - DataCubeFontTextAlignment.LEFT, - ) + configuration.setTextAlign(DataCubeFontTextAlignment.LEFT) } > @@ -538,14 +624,12 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(() => { 'relative -ml-[1px] flex h-5 w-5 items-center justify-center border border-neutral-400 bg-neutral-50 p-0 text-neutral-700 focus-visible:z-[1]', { 'bg-neutral-200': - configuration.defaultTextAlign === + configuration.textAlign === DataCubeFontTextAlignment.CENTER, }, )} onClick={() => - configuration.setDefaultTextAlign( - DataCubeFontTextAlignment.CENTER, - ) + configuration.setTextAlign(DataCubeFontTextAlignment.CENTER) } > @@ -556,14 +640,12 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(() => { 'relative -ml-[1px] flex h-5 w-5 items-center justify-center rounded-br-sm rounded-tr-sm border border-neutral-400 bg-neutral-50 p-0 text-neutral-700 focus-visible:z-[1]', { 'bg-neutral-200': - configuration.defaultTextAlign === + configuration.textAlign === DataCubeFontTextAlignment.RIGHT, }, )} onClick={() => - configuration.setDefaultTextAlign( - DataCubeFontTextAlignment.RIGHT, - ) + configuration.setTextAlign(DataCubeFontTextAlignment.RIGHT) } > @@ -597,37 +679,37 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(() => {
- configuration.setDefaultForegroundColor(value) + configuration.setNormalForegroundColor(value) } />
- configuration.setDefaultForegroundNegativeColor(value) + configuration.setNegativeForegroundColor(value) } />
- configuration.setDefaultForegroundZeroColor(value) + configuration.setZeroForegroundColor(value) } />
- configuration.setDefaultForegroundErrorColor(value) + configuration.setErrorForegroundColor(value) } />
@@ -638,37 +720,37 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(() => {
- configuration.setDefaultBackgroundColor(value) + configuration.setNormalBackgroundColor(value) } />
- configuration.setDefaultBackgroundNegativeColor(value) + configuration.setNegativeBackgroundColor(value) } />
- configuration.setDefaultBackgroundZeroColor(value) + configuration.setZeroBackgroundColor(value) } />
- configuration.setDefaultBackgroundErrorColor(value) + configuration.setErrorBackgroundColor(value) } />
@@ -676,39 +758,18 @@ export const DataCubeEditorGeneralPropertiesPanel = observer(() => {
-
-
- Hightlight Rows: +
+
+
+
+
- - configuration.setAlternateRows(!configuration.alternateRows) - } - /> - value !== undefined && value > 0} - value={configuration.alternateRowsCount} - setValue={(value) => - configuration.setAlternateRowsCount(value ?? 1) - } - /> -
{`row(s)`}
- - configuration.setDefaultBackgroundErrorColor(value) - } - />
diff --git a/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorHPivotsPanel.tsx b/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorHPivotsPanel.tsx index 6350180d5c..7a81abc6b0 100644 --- a/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorHPivotsPanel.tsx +++ b/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorHPivotsPanel.tsx @@ -18,10 +18,11 @@ import { DataCubeIcon } from '@finos/legend-art'; import { observer } from 'mobx-react-lite'; import { useREPLStore } from '../../REPLStoreProvider.js'; import { useEffect } from 'react'; +import { WIP_Badge } from './DataCubeEditorShared.js'; export const DataCubeEditorHPivotsPanel = observer(() => { const replStore = useREPLStore(); - const panel = replStore.dataCube.editor.sortsPanel; + const panel = replStore.dataCube.editor.sorts; useEffect(() => {}, [panel]); // TODO: @akphi - remove this dummy useEffect @@ -33,6 +34,7 @@ export const DataCubeEditorHPivotsPanel = observer(() => {
Horizontal Pivots +
diff --git a/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorShared.tsx b/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorShared.tsx index 73ba560fec..24c12a7cac 100644 --- a/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorShared.tsx +++ b/packages/legend-application-repl/src/components/dataCube/editor/DataCubeEditorShared.tsx @@ -23,6 +23,7 @@ import { DropdownMenuItem, HexAlphaColorPicker, HexColorInput, + parseColor, TailwindCSSPalette, type CheckboxProps, type DropdownMenuItemProps, @@ -36,7 +37,7 @@ import React, { forwardRef, useEffect, useState } from 'react'; export function WIP_Badge() { return (
WIP @@ -44,6 +45,17 @@ export function WIP_Badge() { ); } +export function Advanced_Badge() { + return ( +
+ ADV +
+ ); +} + export const DataCubeEditorNumberInput = forwardRef( function DataCubeEditorBaseNumberInput( props: React.InputHTMLAttributes & { @@ -80,7 +92,7 @@ export const DataCubeEditorNumberInput = forwardRef( return ( - {props.children} -
+
+ {props.children} +
+
@@ -233,7 +247,7 @@ export function DataCubeEditorDropdownMenuItem(props: DropdownMenuItemProps) { return ( { + onChange( + // if color is completely transparent, set it to #00000000 + parseColor(color).alpha === 0 ? TailwindCSSPalette.transparent : color, + ); + onClose(); + }; return (
@@ -297,8 +318,12 @@ function DataCubeEditorColorPicker(props: { style={{ background: TailwindCSSPalette[scale][level], }} - onClick={(): void => { + onClick={() => { + setColor(TailwindCSSPalette[scale][level]); + }} + onDoubleClick={() => { setColor(TailwindCSSPalette[scale][level]); + submit(); }} /> ))} @@ -309,37 +334,47 @@ function DataCubeEditorColorPicker(props: {
{[ // Colors from Better Colors - https://clrs.cc/ + TailwindCSSPalette.transparent, '#000000', - '#111111', - '#AAAAAA', - '#DDDDDD', - '#FFFFFF', - '#FF4136', - '#FF851B', - '#FFDC00', - '#01FF70', - '#2ECC40', - '#3D9970', - '#39CCCC', - '#7FDBFF', - '#0074D9', - '#001F3F', - '#B10DC9', - '#F012BE', - '#85144B', + '#aaaaaa', + '#dddddd', + '#ffffff', + '#ff4136', + '#ff851b', + '#ffdc00', + '#01ff70', + '#2ecc40', + '#3d9970', + '#39cccc', + '#7fdbff', + '#0074d9', + '#001f3f', + '#b10dc9', + '#f012be', + '#85144b', ].map((_color) => (
))} @@ -349,7 +384,7 @@ function DataCubeEditorColorPicker(props: {
{ + onClick={() => { setColor(defaultColor); }} > @@ -375,7 +410,7 @@ function DataCubeEditorColorPicker(props: { )}
diff --git a/packages/legend-application-repl/src/components/dataCube/grid/DataCubeGrid.tsx b/packages/legend-application-repl/src/components/dataCube/grid/DataCubeGrid.tsx index c334b3e072..1d1c738ba5 100644 --- a/packages/legend-application-repl/src/components/dataCube/grid/DataCubeGrid.tsx +++ b/packages/legend-application-repl/src/components/dataCube/grid/DataCubeGrid.tsx @@ -22,16 +22,34 @@ import { RowGroupingModule } from '@ag-grid-enterprise/row-grouping'; import { ClipboardModule } from '@ag-grid-enterprise/clipboard'; import { MenuModule } from '@ag-grid-enterprise/menu'; import { AgGridReact } from '@ag-grid-community/react'; -import { useEffect, useState } from 'react'; +import { useEffect } from 'react'; import { useREPLStore } from '../../REPLStoreProvider.js'; -import { DataCubeIcon, Switch, cn } from '@finos/legend-art'; +import { DataCubeIcon, Switch, cn, Global, css } from '@finos/legend-art'; import { - INTERNAL__GRID_CLIENT_HEADER_HEIGHT, - INTERNAL__GRID_CLIENT_ROW_HEIGHT, + generateBackgroundColorUtilityClassName, + generateFontCaseUtilityClassName, + generateFontFamilyUtilityClassName, + generateFontSizeUtilityClassName, + generateFontUnderlineUtilityClassName, + generateTextAlignUtilityClassName, + generateTextColorUtilityClassName, + INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME, } from '../../../stores/dataCube/grid/DataCubeGridClientEngine.js'; import { RangeSelectionModule } from '@ag-grid-enterprise/range-selection'; -import { buildGridMenu } from './menu/DataCubeGridMenu.js'; -import { DEFAULT_ROW_BUFFER } from '../../../stores/dataCube/core/DataCubeQueryEngine.js'; +import { + DataCubeFont, + DataCubeFontCase, + DataCubeFontFormatUnderlineVariant, + DataCubeFontTextAlignment, + DEFAULT_ROW_BACKGROUND_COLOR, + DEFAULT_ROW_HIGHLIGHT_BACKGROUND_COLOR, +} from '../../../stores/dataCube/core/DataCubeQueryEngine.js'; +import { isNonNullable } from '@finos/legend-shared'; +import type { + DataCubeConfiguration, + DataCubeConfigurationColorKey, +} from '../../../stores/dataCube/core/DataCubeConfiguration.js'; +import { generateBaseGridOptions } from '../../../stores/dataCube/grid/DataCubeGridQuerySnapshotAnalyzer.js'; // NOTE: This is a workaround to prevent ag-grid license key check from flooding the console screen // with its stack trace in Chrome. @@ -43,11 +61,292 @@ console.error = (message?: unknown, ...agrs: unknown[]): void => { console.log(`%c ${message}`, 'color: silver'); // eslint-disable-line no-console }; +function textColorStyle( + key: DataCubeConfigurationColorKey, + configuration: DataCubeConfiguration, +) { + return `${Array.from( + new Set([ + configuration[`${key}ForegroundColor`], + ...configuration.columns + .map((column) => column[`${key}ForegroundColor`]) + .filter(isNonNullable), + ]).values(), + ) + .map( + (color) => + `.${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.ROOT} .${generateTextColorUtilityClassName(color, key)}{color:${color};}`, + ) + .join('\n')}`; +} + +function backgroundColorStyle( + key: DataCubeConfigurationColorKey, + configuration: DataCubeConfiguration, +) { + return `${Array.from( + new Set([ + configuration[`${key}BackgroundColor`], + ...configuration.columns + .map((column) => column[`${key}BackgroundColor`]) + .filter(isNonNullable), + ]).values(), + ) + .map( + (color) => + `.${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.ROOT} .${generateBackgroundColorUtilityClassName(color, key)}{background-color:${color};}`, + ) + .join('\n')};`; +} + +export const DataCubeGridStyleController = observer(() => { + const replStore = useREPLStore(); + const dataCube = replStore.dataCube; + const grid = dataCube.grid; + const configuration = grid.queryConfiguration; + + return ( + + `.${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.ROOT} .${generateFontFamilyUtilityClassName(fontFamily)}{font-family:${fontFamily},sans-serif;}`, + ) + .join('\n')} + ${[ + DataCubeFont.GEORGIA, + DataCubeFont.ROBOTO_SERIF, + DataCubeFont.TIMES_NEW_ROMAN, + ] + .map( + (fontFamily) => + `.${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.ROOT} .${generateFontFamilyUtilityClassName(fontFamily)}{font-family:${fontFamily},serif;}`, + ) + .join('\n')} + ${[ + DataCubeFont.JERBRAINS_MONO, + DataCubeFont.ROBOTO_MONO, + DataCubeFont.UBUNTU_MONO, + ] + .map( + (fontFamily) => + `.${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.ROOT} .${generateFontFamilyUtilityClassName(fontFamily)}{font-family:${fontFamily},monospace;}`, + ) + .join('\n')} + .${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.FONT_BOLD} { + font-weight: 700; + } + ${[ + 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 32, 36, + 48, 72, + ] + .map( + (fontSize) => + `.${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.ROOT} .${generateFontSizeUtilityClassName(fontSize)}{font-size:${fontSize}px;}`, + ) + .join('\n')} + .${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.ROOT} + .${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.FONT_ITALIC} { + font-style: italic; + } + ${[ + DataCubeFontFormatUnderlineVariant.SOLID, + DataCubeFontFormatUnderlineVariant.DASHED, + DataCubeFontFormatUnderlineVariant.DOTTED, + DataCubeFontFormatUnderlineVariant.DOUBLE, + DataCubeFontFormatUnderlineVariant.WAVY, + ] + .map( + (variant) => + `.${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.ROOT} .${generateFontUnderlineUtilityClassName(variant)}{text-decoration:underline ${variant};}`, + ) + .join('\n')} + .${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.ROOT} .${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.FONT_STRIKETHROUGH} { + text-decoration: line-through; + } + ${[ + DataCubeFontCase.LOWERCASE, + DataCubeFontCase.UPPERCASE, + DataCubeFontCase.CAPITALIZE, + ] + .map( + (fontCase) => + `.${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.ROOT} .${generateFontCaseUtilityClassName(fontCase)}{text-transform:${fontCase};}`, + ) + .join('\n')} + ${[ + DataCubeFontTextAlignment.LEFT, + DataCubeFontTextAlignment.CENTER, + DataCubeFontTextAlignment.RIGHT, + ] + .map( + (alignment) => + `.${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.ROOT} .${generateTextAlignUtilityClassName(alignment)}{text-align:${alignment};}`, + ) + .join('\n')}; + ${backgroundColorStyle('normal', configuration)} + ${backgroundColorStyle('zero', configuration)} + ${backgroundColorStyle('negative', configuration)} + ${backgroundColorStyle('error', configuration)} + ${textColorStyle('normal', configuration)} + ${textColorStyle('zero', configuration)} + ${textColorStyle('negative', configuration)} + ${textColorStyle('error', configuration)} + .${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.ROOT} + .${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.BLUR} { + filter: blur(3px); + } + .${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.ROOT} + .${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.BLUR}:hover { + filter: none; + } + `} + /> + ); +}); + +const DataCubeGridStatusBar = observer(() => { + const replStore = useREPLStore(); + const dataCube = replStore.dataCube; + const grid = dataCube.grid; + const scrollHintText = grid.scrollHintText; + + return ( +
+ {Boolean(scrollHintText) && ( +
+ +
{scrollHintText}
+
+ )} +
+
+
+ {grid.clientDataSource.rowCount + ? `Rows: ${grid.clientDataSource.rowCount}` + : ''} +
+ {grid.datasourceConfiguration.limit !== undefined && + grid.queryConfiguration.showWarningForTruncatedResult && ( + // TODO: if we want to properly warn if the data has been truncated due to row limit, + // this would require us to fetch n+1 rows when limit=n + // This is feature is not difficult to implement, but it would be implemented most cleanly + // when we change the query execution engine to return the total number of rows, + // so for now, we simply just warn about truncation whenever a limit != -1 is specified + <> +
+
+ +
{`Results truncated to fit within row limit (${grid.datasourceConfiguration.limit})`}
+
+ + )} +
+ +
+
+ ); +}); + +const DataCubeGridClient = observer(() => { + const replStore = useREPLStore(); + const dataCube = replStore.dataCube; + const grid = dataCube.grid; + + return ( +
+ { + grid.configureClient(params.api); + // restore original error logging + console.error = __INTERNAL__original_console_error; // eslint-disable-line no-console + }} + modules={[ + // community + ClientSideRowModelModule, + // enterprise + ServerSideRowModelModule, + RowGroupingModule, + MenuModule, + ClipboardModule, + RangeSelectionModule, + ]} + {...generateBaseGridOptions(dataCube)} + /> +
+ ); +}); + export const DataCubeGrid = observer(() => { const replStore = useREPLStore(); const dataCube = replStore.dataCube; const grid = dataCube.grid; - const [scrollHintText, setScrollHintText] = useState(''); useEffect(() => { if (grid.clientLicenseKey) { @@ -56,148 +355,10 @@ export const DataCubeGrid = observer(() => { }, [grid.clientLicenseKey]); return ( -
-
- ( -
-
- -
- 0 rows -
- )} - loadingOverlayComponent={() => ( -
-
- -
- Loading... -
- )} - preventDefaultOnContextMenu={true} - columnMenu="new" // ensure context menu works on header - getContextMenuItems={buildGridMenu} - getMainMenuItems={buildGridMenu} - enableRangeSelection={true} - // Show cursor position when scrolling - onBodyScroll={(event) => { - const rowCount = event.api.getDisplayedRowCount(); - const range = event.api.getVerticalPixelRange(); - const start = Math.max( - 1, - Math.ceil(range.top / INTERNAL__GRID_CLIENT_ROW_HEIGHT) + 1, - ); - const end = Math.min( - rowCount, - Math.floor(range.bottom / INTERNAL__GRID_CLIENT_ROW_HEIGHT), - ); - setScrollHintText(`${start}-${end}/${rowCount}`); - event.api.hidePopupMenu(); // hide context-menu while scrolling - }} - onBodyScrollEnd={() => setScrollHintText('')} - // -------------------------------------- SERVER SIDE ROW MODEL -------------------------------------- - rowModelType="serverSide" - serverSideDatasource={grid.clientDataSource} - // -------------------------------------- PERFORMANCE -------------------------------------- - // NOTE: since we shrink the spacing, more rows can be shown, as such, setting higher row - // buffer will improve scrolling performance, but compromise initial load and various - // actions performance - rowBuffer={DEFAULT_ROW_BUFFER} - animateRows={false} // improve performance - // -------------------------------------- SETUP -------------------------------------- - modules={[ - // community - ClientSideRowModelModule, - // enterprise - ServerSideRowModelModule, - RowGroupingModule, - MenuModule, - ClipboardModule, - RangeSelectionModule, - ]} - onGridReady={(params): void => { - grid.configureClient(params.api); - // restore original error logging - console.error = __INTERNAL__original_console_error; // eslint-disable-line no-console - }} - context={{ - dataCube, - }} - /> -
-
- {Boolean(scrollHintText) && ( -
- -
{scrollHintText}
-
- )} -
-
-
- {grid.clientDataSource.rowCount - ? `(${grid.clientDataSource.rowCount} rows)` - : ''} -
-
- -
-
+
+ + +
); }); diff --git a/packages/legend-application-repl/src/components/dataCube/grid/DataCubeGridShared.tsx b/packages/legend-application-repl/src/components/dataCube/grid/DataCubeGridShared.tsx index 2e5c4a06ba..1d862ae97b 100644 --- a/packages/legend-application-repl/src/components/dataCube/grid/DataCubeGridShared.tsx +++ b/packages/legend-application-repl/src/components/dataCube/grid/DataCubeGridShared.tsx @@ -20,7 +20,11 @@ import { } from '@ag-grid-community/react'; import { WIP_Badge } from '../editor/DataCubeEditorShared.js'; -export function WIP_GridMenuItem({ name, subMenu }: CustomMenuItemProps) { +export function WIP_GridMenuItem({ + name, + subMenu, + checked, +}: CustomMenuItemProps) { useGridMenuItem({ configureDefaults: () => true, }); diff --git a/packages/legend-application-repl/src/components/dataCube/grid/menu/DataCubeGridMenu.tsx b/packages/legend-application-repl/src/components/dataCube/grid/menu/DataCubeGridMenu.tsx index bdcdf24c69..4aa2cf0940 100644 --- a/packages/legend-application-repl/src/components/dataCube/grid/menu/DataCubeGridMenu.tsx +++ b/packages/legend-application-repl/src/components/dataCube/grid/menu/DataCubeGridMenu.tsx @@ -22,6 +22,11 @@ import type { import type { DataCubeState } from '../../../../stores/dataCube/DataCubeState.js'; import { buildGridSortsMenu } from './DataCubeGridSortsMenu.js'; import { WIP_GridMenuItem } from '../DataCubeGridShared.js'; +import { + DataCubeColumnPinPlacement, + DEFAULT_COLUMN_MIN_WIDTH, +} from '../../../../stores/dataCube/core/DataCubeQueryEngine.js'; +import { isNonNullable } from '@finos/legend-shared'; export function buildGridMenu( params: @@ -32,6 +37,9 @@ export function buildGridMenu( const dataCube = context.dataCube; const editor = dataCube.editor; const column = params.column ?? undefined; + const columnConfiguration = editor.columnProperties.getColumnConfiguration( + column?.getColId(), + ); const value: unknown = 'value' in params ? params.value : undefined; const result: (string | MenuItemDef)[] = [ @@ -308,55 +316,94 @@ export function buildGridMenu( 'separator', { name: 'Resize', - menuItem: WIP_GridMenuItem, - cssClasses: ['!opacity-100'], - disabled: true, subMenu: [ { - name: `Size to Fit Content`, - menuItem: WIP_GridMenuItem, - cssClasses: ['!opacity-100'], - disabled: true, + name: `Auto-size to Fit Content`, + action: () => + params.api.autoSizeColumns( + [column?.getColId()].filter(isNonNullable), + ), + disabled: !column, + }, + { + name: `Minimize Column`, + action: () => { + if (column) { + params.api.setColumnWidths([ + { + key: column.getColId(), + newWidth: + columnConfiguration?.minWidth ?? DEFAULT_COLUMN_MIN_WIDTH, + }, + ]); + } + }, + disabled: !column, }, + 'separator', { - name: `Autosize`, - menuItem: WIP_GridMenuItem, - cssClasses: ['!opacity-100'], - disabled: true, + name: `Auto-size All Columns`, + action: () => params.api.autoSizeAllColumns(), }, - 'separator', { - name: `Autosize All Columns`, - menuItem: WIP_GridMenuItem, - cssClasses: ['!opacity-100'], - disabled: true, + name: `Minimize All Columns`, + action: () => { + params.api.setColumnWidths( + dataCube.editor.columnProperties.columns.map((col) => ({ + key: col.name, + newWidth: + columnConfiguration?.minWidth ?? DEFAULT_COLUMN_MIN_WIDTH, + })), + ); + }, + }, + { + name: `Size Grid to Fit Screen`, + action: () => params.api.sizeColumnsToFit(), }, ], }, { name: 'Pin', - menuItem: WIP_GridMenuItem, - cssClasses: ['!opacity-100'], - disabled: true, subMenu: [ { name: `Pin Left`, - menuItem: WIP_GridMenuItem, - cssClasses: ['!opacity-100'], - disabled: true, + disabled: !column || column.isPinnedLeft(), + checked: Boolean(column?.isPinnedLeft()), + action: () => { + columnConfiguration?.setPinned(DataCubeColumnPinPlacement.LEFT); + editor.applyChanges(); + }, }, { name: `Pin Right`, - menuItem: WIP_GridMenuItem, - cssClasses: ['!opacity-100'], - disabled: true, + disabled: !column || column.isPinnedRight(), + checked: Boolean(column?.isPinnedRight()), + action: () => { + columnConfiguration?.setPinned(DataCubeColumnPinPlacement.RIGHT); + editor.applyChanges(); + }, + }, + { + name: `Unpin`, + disabled: !column?.isPinned(), + action: () => { + columnConfiguration?.setPinned(undefined); + editor.applyChanges(); + }, }, 'separator', { - name: `Remove Pinning`, - menuItem: WIP_GridMenuItem, - cssClasses: ['!opacity-100'], - disabled: true, + name: `Remove All Pinnings`, + disabled: editor.columnProperties.columns.every( + (col) => col.pinned === undefined, + ), + action: () => { + editor.columnProperties.columns.forEach((col) => + col.setPinned(undefined), + ); + editor.applyChanges(); + }, }, ], }, diff --git a/packages/legend-application-repl/src/components/dataCube/grid/menu/DataCubeGridSortsMenu.tsx b/packages/legend-application-repl/src/components/dataCube/grid/menu/DataCubeGridSortsMenu.tsx index 113ccfc69c..b6da1aaff4 100644 --- a/packages/legend-application-repl/src/components/dataCube/grid/menu/DataCubeGridSortsMenu.tsx +++ b/packages/legend-application-repl/src/components/dataCube/grid/menu/DataCubeGridSortsMenu.tsx @@ -37,12 +37,12 @@ export function buildGridSortsMenu( subMenu: [ { name: 'Ascending', - disabled: !editor.sortsPanel.getActionableSortColumn( + disabled: !editor.sorts.getActionableSortColumn( column.getColId(), DataCubeQuerySnapshotSortOperation.ASCENDING, ), action: () => - editor.sortsPanel.sortByColumn( + editor.sorts.sortByColumn( column.getColId(), DataCubeQuerySnapshotSortOperation.ASCENDING, ), @@ -55,12 +55,12 @@ export function buildGridSortsMenu( }, { name: 'Descending', - disabled: !editor.sortsPanel.getActionableSortColumn( + disabled: !editor.sorts.getActionableSortColumn( column.getColId(), DataCubeQuerySnapshotSortOperation.DESCENDING, ), action: () => - editor.sortsPanel.sortByColumn( + editor.sorts.sortByColumn( column.getColId(), DataCubeQuerySnapshotSortOperation.DESCENDING, ), @@ -74,12 +74,12 @@ export function buildGridSortsMenu( 'separator', { name: 'Add Ascending', - disabled: !editor.sortsPanel.getActionableSortColumn( + disabled: !editor.sorts.getActionableSortColumn( column.getColId(), DataCubeQuerySnapshotSortOperation.ASCENDING, ), action: () => - editor.sortsPanel.addSortByColumn( + editor.sorts.addSortByColumn( column.getColId(), DataCubeQuerySnapshotSortOperation.ASCENDING, ), @@ -92,12 +92,12 @@ export function buildGridSortsMenu( }, { name: 'Add Descending', - disabled: !editor.sortsPanel.getActionableSortColumn( + disabled: !editor.sorts.getActionableSortColumn( column.getColId(), DataCubeQuerySnapshotSortOperation.DESCENDING, ), action: () => - editor.sortsPanel.addSortByColumn( + editor.sorts.addSortByColumn( column.getColId(), DataCubeQuerySnapshotSortOperation.DESCENDING, ), @@ -111,9 +111,8 @@ export function buildGridSortsMenu( 'separator', { name: 'Clear All Sorts', - disabled: - editor.sortsPanel.columnsSelector.selectedColumns.length === 0, - action: () => editor.sortsPanel.clearAllSorts(), + disabled: editor.sorts.columnsSelector.selectedColumns.length === 0, + action: () => editor.sorts.clearAllSorts(), }, ], }; diff --git a/packages/legend-application-repl/src/stores/dataCube/REPLStore.ts b/packages/legend-application-repl/src/stores/REPLStore.ts similarity index 78% rename from packages/legend-application-repl/src/stores/dataCube/REPLStore.ts rename to packages/legend-application-repl/src/stores/REPLStore.ts index b03f21bb87..093d76ba9d 100644 --- a/packages/legend-application-repl/src/stores/dataCube/REPLStore.ts +++ b/packages/legend-application-repl/src/stores/REPLStore.ts @@ -14,16 +14,18 @@ * limitations under the License. */ -import type { LegendREPLApplicationStore } from '../LegendREPLBaseStore.js'; -import { REPLServerClient } from '../../server/REPLServerClient.js'; +import type { LegendREPLApplicationStore } from './LegendREPLBaseStore.js'; +import { REPLServerClient } from '../server/REPLServerClient.js'; import { NetworkClient } from '@finos/legend-shared'; import { makeObservable, observable } from 'mobx'; -import { DataCubeState } from './DataCubeState.js'; +import { DataCubeState } from './dataCube/DataCubeState.js'; +import { DataCubeInfrastructure } from './dataCube/DataCubeInfrastructure.js'; export class REPLStore { readonly applicationStore: LegendREPLApplicationStore; readonly client: REPLServerClient; + dataCubeInfrastructure!: DataCubeInfrastructure; // TODO: when we support multi-view, we would need to support multiple states dataCube!: DataCubeState; @@ -40,6 +42,7 @@ export class REPLStore { : this.applicationStore.config.replUrl, }), ); + this.dataCubeInfrastructure = new DataCubeInfrastructure(this); this.dataCube = new DataCubeState(this); } } diff --git a/packages/legend-application-repl/src/stores/dataCube/core/DataCubeEngine.ts b/packages/legend-application-repl/src/stores/dataCube/DataCubeInfrastructure.ts similarity index 64% rename from packages/legend-application-repl/src/stores/dataCube/core/DataCubeEngine.ts rename to packages/legend-application-repl/src/stores/dataCube/DataCubeInfrastructure.ts index 3e75c86e92..dff16d3071 100644 --- a/packages/legend-application-repl/src/stores/dataCube/core/DataCubeEngine.ts +++ b/packages/legend-application-repl/src/stores/dataCube/DataCubeInfrastructure.ts @@ -23,14 +23,17 @@ import { V1_serializeExecutionResult, V1_buildExecutionResult, } from '@finos/legend-graph'; -import type { REPLServerClient } from '../../../server/REPLServerClient.js'; +import type { REPLServerClient } from '../../server/REPLServerClient.js'; import { DataCubeGetBaseQueryResult, type CompletionItem, -} from '../../../server/models/DataCubeEngineModels.js'; +} from '../../server/models/DataCubeEngineModels.js'; import { guaranteeType } from '@finos/legend-shared'; +import type { LegendREPLApplicationStore } from '../LegendREPLBaseStore.js'; +import type { REPLStore } from '../REPLStore.js'; +import { action, makeObservable, observable } from 'mobx'; -export class DataCubeEngine { +class DataCubeEngine { private readonly client: REPLServerClient; constructor(client: REPLServerClient) { @@ -79,3 +82,37 @@ export class DataCubeEngine { ); } } + +/** + * Infrastructure for data cube, can be shared across multiple data cube states + */ +export class DataCubeInfrastructure { + readonly replStore: REPLStore; + readonly application: LegendREPLApplicationStore; + readonly engine: DataCubeEngine; + + gridClientRowBuffer = 50; + enableDebugMode = false; + + constructor(replStore: REPLStore) { + makeObservable(this, { + gridClientRowBuffer: observable, + setGridClientRowBuffer: action, + + enableDebugMode: observable, + setEnableDebugMode: action, + }); + + this.replStore = replStore; + this.application = replStore.applicationStore; + this.engine = new DataCubeEngine(replStore.client); + } + + setGridClientRowBuffer(rowBuffer: number): void { + this.gridClientRowBuffer = rowBuffer; + } + + setEnableDebugMode(enableDebugMode: boolean): void { + this.enableDebugMode = enableDebugMode; + } +} diff --git a/packages/legend-application-repl/src/stores/dataCube/DataCubeState.ts b/packages/legend-application-repl/src/stores/dataCube/DataCubeState.ts index a7b0c42943..71d3008b62 100644 --- a/packages/legend-application-repl/src/stores/dataCube/DataCubeState.ts +++ b/packages/legend-application-repl/src/stores/dataCube/DataCubeState.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import type { REPLStore } from './REPLStore.js'; +import type { REPLStore } from '../REPLStore.js'; import { DataCubeGridState } from './grid/DataCubeGridState.js'; import { DataCubeEditorState } from './editor/DataCubeEditorState.js'; import { assertErrorThrown, uuid } from '@finos/legend-shared'; -import { DataCubeEngine } from './core/DataCubeEngine.js'; import { DataCubeQuerySnapshotManager } from './core/DataCubeQuerySnapshotManager.js'; import type { LegendREPLApplicationStore } from '../LegendREPLBaseStore.js'; import { DataCubeCoreState } from './core/DataCubeCoreState.js'; import { validateAndBuildQuerySnapshot } from './core/DataCubeQuerySnapshotBuilder.js'; import { action, makeObservable, observable } from 'mobx'; +import type { DataCubeInfrastructure } from './DataCubeInfrastructure.js'; export class DataCubeTask { uuid = uuid(); @@ -43,25 +43,25 @@ export class DataCubeTask { export class DataCubeState { readonly replStore: REPLStore; readonly application: LegendREPLApplicationStore; - readonly engine: DataCubeEngine; + readonly infrastructure: DataCubeInfrastructure; readonly snapshotManager: DataCubeQuerySnapshotManager; readonly core: DataCubeCoreState; readonly grid: DataCubeGridState; readonly editor: DataCubeEditorState; - readonly runningTaskes = new Map(); + readonly runningTasks = new Map(); constructor(replStore: REPLStore) { makeObservable(this, { - runningTaskes: observable, + runningTasks: observable, newTask: action, endTask: action, }); this.replStore = replStore; this.application = replStore.applicationStore; - this.engine = new DataCubeEngine(this.replStore.client); + this.infrastructure = replStore.dataCubeInfrastructure; // NOTE: snapshot manager must be instantiated before subscribers this.snapshotManager = new DataCubeQuerySnapshotManager(this); @@ -72,13 +72,13 @@ export class DataCubeState { newTask(name: string): DataCubeTask { const task = new DataCubeTask(name); - this.runningTaskes.set(task.uuid, task); + this.runningTasks.set(task.uuid, task); return task; } endTask(task: DataCubeTask): DataCubeTask { task.end(); - this.runningTaskes.delete(task.uuid); + this.runningTasks.delete(task.uuid); return task; } @@ -91,7 +91,7 @@ export class DataCubeState { await state.initialize(); }), ); - const result = await this.engine.getBaseQuery(); + const result = await this.infrastructure.engine.getBaseQuery(); const initialSnapshot = validateAndBuildQuerySnapshot( result.partialQuery, result.sourceQuery, diff --git a/packages/legend-application-repl/src/stores/dataCube/core/DataCubeConfiguration.ts b/packages/legend-application-repl/src/stores/dataCube/core/DataCubeConfiguration.ts index bbcc6327d9..ef96234a28 100644 --- a/packages/legend-application-repl/src/stores/dataCube/core/DataCubeConfiguration.ts +++ b/packages/legend-application-repl/src/stores/dataCube/core/DataCubeConfiguration.ts @@ -14,26 +14,40 @@ * limitations under the License. */ -import { TailwindCSSPalette } from '@finos/legend-art'; import { - DataCubeColumnKind, - DataCubeFont, - DataCubeFontTextAlignment, - DEFAULT_ROW_BUFFER, DEFAULT_BACKGROUND_COLOR, DEFAULT_ERROR_FOREGROUND_COLOR, DEFAULT_FOREGROUND_COLOR, DEFAULT_NEGATIVE_FOREGROUND_COLOR, DEFAULT_ROW_HIGHLIGHT_BACKGROUND_COLOR, DEFAULT_ZERO_FOREGROUND_COLOR, - type DataCubeFontFormatUnderlinedVariant, + DEFAULT_GRID_LINE_COLOR, + DEFAULT_FONT_FAMILY, + DEFAULT_FONT_SIZE, + DEFAULT_FONT_BOLD, + DEFAULT_FONT_ITALIC, + DEFAULT_FONT_STRIKETHROUGH, + DEFAULT_TEXT_ALIGN, + DEFAULT_FONT_UNDERLINED, + DEFAULT_FONT_CASE, + DataCubeColumnKind, + type DataCubeFont, + type DataCubeFontTextAlignment, + type DataCubeFontFormatUnderlineVariant, type DataCubeNumberScale, type DataCubeSelectionStat, type DataCubeColumnPinPlacement, + type DataCubeFontCase, } from './DataCubeQueryEngine.js'; import { SerializationFactory, usingModelSchema } from '@finos/legend-shared'; import { createModelSchema, list, optional, primitive } from 'serializr'; +export type DataCubeConfigurationColorKey = + | 'normal' + | 'zero' + | 'negative' + | 'error'; + export class DataCubeColumnConfiguration { name: string; type: string; @@ -48,21 +62,22 @@ export class DataCubeColumnConfiguration { hPivotSortFunction?: string | undefined; - fontFamily = DataCubeFont.ROBOTO; - fontSize = 8; - fontBold = false; - fontItalic = false; - fontUnderlined?: DataCubeFontFormatUnderlinedVariant | undefined = undefined; - fontStrikethrough = false; - textAlign = DataCubeFontTextAlignment.LEFT; - foregroundColor = TailwindCSSPalette.black; - foregroundNegativeColor = DEFAULT_NEGATIVE_FOREGROUND_COLOR; - foregroundZeroColor = DEFAULT_ZERO_FOREGROUND_COLOR; - foregroundErrorColor = DEFAULT_ERROR_FOREGROUND_COLOR; - backgroundColor = DEFAULT_BACKGROUND_COLOR; - backgroundNegativeColor = DEFAULT_BACKGROUND_COLOR; - backgroundZeroColor = DEFAULT_BACKGROUND_COLOR; - backgroundErrorColor = DEFAULT_BACKGROUND_COLOR; + fontFamily?: DataCubeFont | undefined; + fontSize?: number | undefined; + fontBold?: boolean | undefined; + fontItalic?: boolean | undefined; + fontUnderline?: DataCubeFontFormatUnderlineVariant | undefined; + fontStrikethrough?: boolean | undefined; + fontCase?: DataCubeFontCase | undefined; + textAlign?: DataCubeFontTextAlignment | undefined; + normalForegroundColor?: string | undefined; + negativeForegroundColor?: string | undefined; + zeroForegroundColor?: string | undefined; + errorForegroundColor?: string | undefined; + normalBackgroundColor?: string | undefined; + negativeBackgroundColor?: string | undefined; + zeroBackgroundColor?: string | undefined; + errorBackgroundColor?: string | undefined; blur = false; hideFromView = false; @@ -72,6 +87,7 @@ export class DataCubeColumnConfiguration { maxWidth?: number | undefined; pinned?: DataCubeColumnPinPlacement | undefined; displayAsLink = false; + linkLabelParameter?: string | undefined; constructor(name: string, type: string) { this.name = name; @@ -80,35 +96,39 @@ export class DataCubeColumnConfiguration { static readonly serialization = new SerializationFactory( createModelSchema(DataCubeColumnConfiguration, { - backgroundColor: primitive(), - backgroundErrorColor: primitive(), - backgroundNegativeColor: primitive(), - backgroundZeroColor: primitive(), + blur: primitive(), decimals: optional(primitive()), displayAsLink: primitive(), displayCommas: primitive(), displayName: optional(primitive()), + errorBackgroundColor: optional(primitive()), + errorForegroundColor: optional(primitive()), fixedWidth: optional(primitive()), - foregroundColor: primitive(), - foregroundErrorColor: primitive(), - foregroundNegativeColor: primitive(), - foregroundZeroColor: primitive(), - fontBold: primitive(), - fontFamily: primitive(), - fontItalic: primitive(), - fontSize: primitive(), - fontStrikethrough: primitive(), - fontUnderlined: optional(primitive()), + fontBold: optional(primitive()), + fontCase: optional(primitive()), + fontFamily: optional(primitive()), + fontItalic: optional(primitive()), + fontSize: optional(primitive()), + fontStrikethrough: optional(primitive()), + fontUnderline: optional(primitive()), + hideFromView: primitive(), hPivotSortFunction: optional(primitive()), kind: primitive(), + linkLabelParameter: optional(primitive()), maxWidth: optional(primitive()), minWidth: optional(primitive()), name: primitive(), + negativeBackgroundColor: optional(primitive()), + negativeForegroundColor: optional(primitive()), + normalBackgroundColor: optional(primitive()), + normalForegroundColor: optional(primitive()), negativeNumberInParens: primitive(), numberScale: optional(primitive()), pinned: optional(primitive()), - textAlign: primitive(), + textAlign: optional(primitive()), type: primitive(), + zeroBackgroundColor: optional(primitive()), + zeroForegroundColor: optional(primitive()), }), ); } @@ -117,45 +137,45 @@ export class DataCubeConfiguration { description?: string | undefined; columns: DataCubeColumnConfiguration[] = []; - showTreeLine = true; - showHorizontalGridLine = false; - showVerticalGridLine = false; - defaultFontFamily = DataCubeFont.ROBOTO; - defaultFontSize = 12; - defaultFontBold = false; - defaultFontItalic = false; - defaultFontUnderlined?: DataCubeFontFormatUnderlinedVariant | undefined = - undefined; - defaultFontStrikethrough = false; - defaultTextAlign = DataCubeFontTextAlignment.LEFT; - defaultForegroundColor = DEFAULT_FOREGROUND_COLOR; - defaultForegroundNegativeColor = DEFAULT_NEGATIVE_FOREGROUND_COLOR; - defaultForegroundZeroColor = DEFAULT_ZERO_FOREGROUND_COLOR; - defaultForegroundErrorColor = DEFAULT_ERROR_FOREGROUND_COLOR; - defaultBackgroundColor = DEFAULT_BACKGROUND_COLOR; - defaultBackgroundNegativeColor = DEFAULT_BACKGROUND_COLOR; - defaultBackgroundZeroColor = DEFAULT_BACKGROUND_COLOR; - defaultBackgroundErrorColor = DEFAULT_BACKGROUND_COLOR; - alternateRows = true; + showTreeLines = false; + showHorizontalGridLines = false; + showVerticalGridLines = true; + gridLineColor = DEFAULT_GRID_LINE_COLOR; + + fontFamily = DEFAULT_FONT_FAMILY; + fontSize = DEFAULT_FONT_SIZE; + fontBold = DEFAULT_FONT_BOLD; + fontItalic = DEFAULT_FONT_ITALIC; + fontUnderline?: DataCubeFontFormatUnderlineVariant | undefined = + DEFAULT_FONT_UNDERLINED; + fontStrikethrough = DEFAULT_FONT_STRIKETHROUGH; + fontCase?: DataCubeFontCase | undefined = DEFAULT_FONT_CASE; + textAlign = DEFAULT_TEXT_ALIGN; + normalForegroundColor = DEFAULT_FOREGROUND_COLOR; + negativeForegroundColor = DEFAULT_NEGATIVE_FOREGROUND_COLOR; + zeroForegroundColor = DEFAULT_ZERO_FOREGROUND_COLOR; + errorForegroundColor = DEFAULT_ERROR_FOREGROUND_COLOR; + normalBackgroundColor = DEFAULT_BACKGROUND_COLOR; + negativeBackgroundColor = DEFAULT_BACKGROUND_COLOR; + zeroBackgroundColor = DEFAULT_BACKGROUND_COLOR; + errorBackgroundColor = DEFAULT_BACKGROUND_COLOR; + + alternateRows = false; + alternateRowsStandardMode = true; alternateRowsColor = DEFAULT_ROW_HIGHLIGHT_BACKGROUND_COLOR; alternateRowsCount = 1; - // manualRefresh: boolean; - numberScale?: DataCubeNumberScale | undefined; - selectionStats: DataCubeSelectionStat[] = []; - - showWarningForTruncatedResult = true; - // aggregation initialExpandLevel?: number | undefined; showRootAggregation = false; - showLeafCount = true; + showLeafCount = false; addPivotTotalColumn = true; addPivotTotalColumnOnLeft = true; treeGroupSortFunction?: string | undefined; - // advanced - rowBuffer = DEFAULT_ROW_BUFFER; + // misc + selectionStats: DataCubeSelectionStat[] = []; + showWarningForTruncatedResult = true; static readonly serialization = new SerializationFactory( createModelSchema(DataCubeConfiguration, { @@ -164,37 +184,37 @@ export class DataCubeConfiguration { alternateRows: primitive(), alternateRowsColor: primitive(), alternateRowsCount: primitive(), + alternateRowsStandardMode: primitive(), columns: list( usingModelSchema(DataCubeColumnConfiguration.serialization.schema), ), - defaultBackgroundColor: primitive(), - defaultBackgroundErrorColor: primitive(), - defaultBackgroundNegativeColor: primitive(), - defaultBackgroundZeroColor: primitive(), - defaultFontBold: primitive(), - defaultFontFamily: primitive(), - defaultFontItalic: primitive(), - defaultFontSize: primitive(), - defaultFontStrikethrough: primitive(), - defaultFontUnderlined: optional(primitive()), - defaultForegroundColor: primitive(), - defaultForegroundErrorColor: primitive(), - defaultForegroundNegativeColor: primitive(), - defaultForegroundZeroColor: primitive(), - defaultTextAlign: primitive(), + errorBackgroundColor: primitive(), + errorForegroundColor: primitive(), description: optional(primitive()), + fontBold: primitive(), + fontCase: optional(primitive()), + fontFamily: primitive(), + fontItalic: primitive(), + fontSize: primitive(), + fontStrikethrough: primitive(), + fontUnderline: optional(primitive()), + gridLineColor: primitive(), initialExpandLevel: optional(primitive()), - - numberScale: optional(primitive()), - rowBuffer: primitive(), + negativeBackgroundColor: primitive(), + negativeForegroundColor: primitive(), + normalBackgroundColor: primitive(), + normalForegroundColor: primitive(), selectionStats: list(primitive()), - showHorizontalGridLine: primitive(), + showHorizontalGridLines: primitive(), showLeafCount: primitive(), showRootAggregation: primitive(), - showTreeLine: primitive(), - showVerticalGridLine: primitive(), + showTreeLines: primitive(), + showVerticalGridLines: primitive(), showWarningForTruncatedResult: primitive(), + textAlign: primitive(), treeGroupSortFunction: optional(primitive()), + zeroBackgroundColor: primitive(), + zeroForegroundColor: primitive(), }), ); } diff --git a/packages/legend-application-repl/src/stores/dataCube/core/DataCubeConfigurationBuilder.ts b/packages/legend-application-repl/src/stores/dataCube/core/DataCubeConfigurationBuilder.ts index 0469265056..73a43f2983 100644 --- a/packages/legend-application-repl/src/stores/dataCube/core/DataCubeConfigurationBuilder.ts +++ b/packages/legend-application-repl/src/stores/dataCube/core/DataCubeConfigurationBuilder.ts @@ -19,7 +19,10 @@ import { DataCubeColumnConfiguration, DataCubeConfiguration, } from './DataCubeConfiguration.js'; -import { DataCubeColumnKind } from './DataCubeQueryEngine.js'; +import { + DataCubeColumnKind, + DataCubeFontTextAlignment, +} from './DataCubeQueryEngine.js'; export function buildDefaultColumnConfiguration(column: { name: string; @@ -36,6 +39,7 @@ export function buildDefaultColumnConfiguration(column: { config.decimals = type === PRIMITIVE_TYPE.INTEGER ? 0 : 2; config.displayCommas = true; config.negativeNumberInParens = true; + config.textAlign = DataCubeFontTextAlignment.RIGHT; // always align number to the right break; } default: { diff --git a/packages/legend-application-repl/src/stores/dataCube/core/DataCubeCoreState.ts b/packages/legend-application-repl/src/stores/dataCube/core/DataCubeCoreState.ts index bec83196c3..e22503f647 100644 --- a/packages/legend-application-repl/src/stores/dataCube/core/DataCubeCoreState.ts +++ b/packages/legend-application-repl/src/stores/dataCube/core/DataCubeCoreState.ts @@ -40,7 +40,10 @@ export class DataCubeCoreState extends DataCubeQuerySnapshotSubscriber { this.name = val; } - override async applySnapshot(snapshot: DataCubeQuerySnapshot): Promise { + override async applySnapshot( + snapshot: DataCubeQuerySnapshot, + previousSnapshot: DataCubeQuerySnapshot | undefined, + ): Promise { const data = snapshot.data; this.setName(data.name); if (!this.startTime) { diff --git a/packages/legend-application-repl/src/stores/dataCube/core/DataCubeQueryBuilder.ts b/packages/legend-application-repl/src/stores/dataCube/core/DataCubeQueryBuilder.ts index dd803bccfd..94a0c13bd5 100644 --- a/packages/legend-application-repl/src/stores/dataCube/core/DataCubeQueryBuilder.ts +++ b/packages/legend-application-repl/src/stores/dataCube/core/DataCubeQueryBuilder.ts @@ -332,6 +332,17 @@ export function buildExecutableQuery( funcMap[funcMapKey] = func; }; + // --------------------------------- FILTER --------------------------------- + + if (data.filter) { + _process( + 'filter', + _function(_name(DataCubeFunction.FILTER), [ + _lambda([_var()], [_filter(data.filter)]), + ]), + ); + } + // --------------------------------- LEAF EXTEND --------------------------------- if (data.leafExtendedColumns.length) { @@ -358,17 +369,6 @@ export function buildExecutableQuery( ); } - // --------------------------------- FILTER --------------------------------- - - if (data.filter) { - _process( - 'filter', - _function(_name(DataCubeFunction.FILTER), [ - _lambda([_var()], [_filter(data.filter)]), - ]), - ); - } - // --------------------------------- GROUP BY --------------------------------- if (data.groupBy) { diff --git a/packages/legend-application-repl/src/stores/dataCube/core/DataCubeQueryEngine.ts b/packages/legend-application-repl/src/stores/dataCube/core/DataCubeQueryEngine.ts index 9136fbf8ab..96baec53e8 100644 --- a/packages/legend-application-repl/src/stores/dataCube/core/DataCubeQueryEngine.ts +++ b/packages/legend-application-repl/src/stores/dataCube/core/DataCubeQueryEngine.ts @@ -79,7 +79,7 @@ export const PIVOT_COLUMN_NAME_VALUE_SEPARATOR = '__|__'; // when no aggregate is specified in groupBy() or pivot() export const INTERNAL__FILLER_COUNT_AGG_COLUMN_NAME = 'INTERNAL__filler_count_agg_column'; -export const DEFAULT_ROW_BUFFER = 50; +export const DEFAULT_ROW_BUFFER = 20; export type DataCubeQueryFunctionMap = { leafExtend?: V1_AppliedFunction | undefined; @@ -101,7 +101,8 @@ export enum DataCubeNumberScale { THOUSANDS = 'Thousands (k)', MILLIONS = 'Millions (m)', BILLIONS = 'Billions (b)', - AUTO = 'Auto (k/m/b)', + TRILLIONS = 'Trillions (t)', + AUTO = 'Auto (k/m/b/t)', } export enum DataCubeSelectionStat { @@ -123,63 +124,30 @@ export enum DataCubeFont { GEORGIA = 'Georgia', ROBOTO_SERIF = 'Roboto Serif', - // monospaced + // monospace JERBRAINS_MONO = 'Jetbrains Mono', ROBOTO_MONO = 'Roboto Mono', UBUNTU_MONO = 'Ubuntu Mono', } export enum DataCubeFontTextAlignment { - CENTER = 'Center', - LEFT = 'Left', - RIGHT = 'Right', + CENTER = 'center', + LEFT = 'left', + RIGHT = 'right', } -export enum DataCubeColumnPinPlacement { - LEFT = 'Left', - RIGHT = 'Right', +export enum DataCubeFontCase { + LOWERCASE = 'lowercase', + UPPERCASE = 'uppercase', + CAPITALIZE = 'capitalize', } -export enum DataCubeColumnDataType { - NUMBER = 'number', - DATE = 'date', - TEXT = 'text', -} - -export function getDataType(type: string): DataCubeColumnDataType { - switch (type) { - case PRIMITIVE_TYPE.NUMBER: - case PRIMITIVE_TYPE.INTEGER: - case PRIMITIVE_TYPE.DECIMAL: - case PRIMITIVE_TYPE.FLOAT: - return DataCubeColumnDataType.NUMBER; - case PRIMITIVE_TYPE.DATE: - case PRIMITIVE_TYPE.DATETIME: - case PRIMITIVE_TYPE.STRICTDATE: - return DataCubeColumnDataType.DATE; - case PRIMITIVE_TYPE.STRING: - default: - return DataCubeColumnDataType.TEXT; - } -} - -export const DEFAULT_FOREGROUND_COLOR = TailwindCSSPalette.black; -export const DEFAULT_BACKGROUND_COLOR = TailwindCSSPalette.white; -export const DEFAULT_ROW_HIGHLIGHT_BACKGROUND_COLOR = - TailwindCSSPalette.sky[100]; -export const DEFAULT_NEGATIVE_FOREGROUND_COLOR = TailwindCSSPalette.red[500]; -export const DEFAULT_ZERO_FOREGROUND_COLOR = TailwindCSSPalette.neutral[400]; -export const DEFAULT_ERROR_FOREGROUND_COLOR = TailwindCSSPalette.blue[600]; -export const DEFAULT_COLUMN_WIDTH = 300; -export const DEFAULT_COLUMN_MIN_WIDTH = 100; -export const DEFAULT_COLUMN_MAX_WIDTH = undefined; - -export enum DataCubeFontFormatUnderlinedVariant { - SOLID = 'Solid', - DASHED = 'Dashed', - DOTTED = 'Dotted', - DOUBLE = 'Double', - WAVY = 'Wavy', +export enum DataCubeFontFormatUnderlineVariant { + SOLID = 'solid', + DASHED = 'dashed', + DOTTED = 'dotted', + DOUBLE = 'double', + WAVY = 'wavy', } export enum DataCubeColumnKind { @@ -220,3 +188,56 @@ export enum DataCubeAggregateFunction { // wsum // custom } + +export enum DataCubeColumnPinPlacement { + LEFT = 'Left', + RIGHT = 'Right', +} + +export enum DataCubeColumnDataType { + NUMBER = 'number', + DATE = 'date', + TEXT = 'text', +} + +export function getDataType(type: string): DataCubeColumnDataType { + switch (type) { + case PRIMITIVE_TYPE.NUMBER: + case PRIMITIVE_TYPE.INTEGER: + case PRIMITIVE_TYPE.DECIMAL: + case PRIMITIVE_TYPE.FLOAT: + return DataCubeColumnDataType.NUMBER; + case PRIMITIVE_TYPE.DATE: + case PRIMITIVE_TYPE.DATETIME: + case PRIMITIVE_TYPE.STRICTDATE: + return DataCubeColumnDataType.DATE; + case PRIMITIVE_TYPE.STRING: + default: + return DataCubeColumnDataType.TEXT; + } +} + +export const DEFAULT_URL_LABEL_QUERY_PARAM = 'dataCube.linkLabel'; + +export const DEFAULT_GRID_LINE_COLOR = TailwindCSSPalette.neutral[200]; +export const DEFAULT_ROW_HIGHLIGHT_BACKGROUND_COLOR = + TailwindCSSPalette.sky[100]; + +export const DEFAULT_COLUMN_WIDTH = 300; +export const DEFAULT_COLUMN_MIN_WIDTH = 50; +export const DEFAULT_COLUMN_MAX_WIDTH = undefined; + +export const DEFAULT_FONT_FAMILY = DataCubeFont.ROBOTO; +export const DEFAULT_FONT_SIZE = 12; +export const DEFAULT_FONT_BOLD = false; +export const DEFAULT_FONT_ITALIC = false; +export const DEFAULT_FONT_CASE = undefined; +export const DEFAULT_FONT_UNDERLINED = undefined; +export const DEFAULT_FONT_STRIKETHROUGH = false; +export const DEFAULT_TEXT_ALIGN = DataCubeFontTextAlignment.LEFT; +export const DEFAULT_FOREGROUND_COLOR = TailwindCSSPalette.black; +export const DEFAULT_BACKGROUND_COLOR = TailwindCSSPalette.transparent; +export const DEFAULT_ROW_BACKGROUND_COLOR = TailwindCSSPalette.white; +export const DEFAULT_NEGATIVE_FOREGROUND_COLOR = TailwindCSSPalette.red[500]; +export const DEFAULT_ZERO_FOREGROUND_COLOR = TailwindCSSPalette.neutral[400]; +export const DEFAULT_ERROR_FOREGROUND_COLOR = TailwindCSSPalette.blue[600]; diff --git a/packages/legend-application-repl/src/stores/dataCube/core/DataCubeQuerySnapshotBuilder.ts b/packages/legend-application-repl/src/stores/dataCube/core/DataCubeQuerySnapshotBuilder.ts index 10d896d189..7ee27edf06 100644 --- a/packages/legend-application-repl/src/stores/dataCube/core/DataCubeQuerySnapshotBuilder.ts +++ b/packages/legend-application-repl/src/stores/dataCube/core/DataCubeQuerySnapshotBuilder.ts @@ -115,12 +115,12 @@ const _SUPPORTED_TOP_LEVEL_FUNCTIONS: { func: string; parameters: number; }[] = [ - { func: DataCubeFunction.EXTEND, parameters: 1 }, { func: DataCubeFunction.FILTER, parameters: 1 }, + { func: DataCubeFunction.EXTEND, parameters: 1 }, + { func: DataCubeFunction.SELECT, parameters: 1 }, { func: DataCubeFunction.GROUP_BY, parameters: 3 }, { func: DataCubeFunction.LIMIT, parameters: 1 }, { func: DataCubeFunction.PIVOT, parameters: 3 }, - { func: DataCubeFunction.SELECT, parameters: 1 }, { func: DataCubeFunction.SORT, parameters: 1 }, { func: DataCubeFunction.CAST, parameters: 1 }, @@ -134,9 +134,9 @@ const _FUNCTION_SEQUENCE_COMPOSITION_PATTERN: { repeat?: boolean | undefined; required?: boolean | undefined; }[] = [ + { func: DataCubeFunction.FILTER }, { func: DataCubeFunction.EXTEND }, { func: DataCubeFunction.SELECT }, - { func: DataCubeFunction.FILTER }, { func: DataCubeFunction.GROUP_BY }, { func: DataCubeFunction.PIVOT }, { func: DataCubeFunction.CAST }, @@ -343,6 +343,9 @@ export function validateAndBuildQuerySnapshot( })); data.originalColumns.map((col) => colsMap.set(col.name, col)); + // --------------------------------- FILTER --------------------------------- + // TODO: @akphi - implement this + // --------------------------------- LEAF EXTEND --------------------------------- // TODO: @akphi - implement this @@ -355,10 +358,6 @@ export function validateAndBuildQuerySnapshot( }), ); } - - // --------------------------------- FILTER --------------------------------- - // TODO: @akphi - implement this - // --------------------------------- GROUP BY --------------------------------- // TODO: @akphi - implement this diff --git a/packages/legend-application-repl/src/stores/dataCube/core/DataCubeQuerySnapshotSubscriber.ts b/packages/legend-application-repl/src/stores/dataCube/core/DataCubeQuerySnapshotSubscriber.ts index b6a84e8213..350da52aaa 100644 --- a/packages/legend-application-repl/src/stores/dataCube/core/DataCubeQuerySnapshotSubscriber.ts +++ b/packages/legend-application-repl/src/stores/dataCube/core/DataCubeQuerySnapshotSubscriber.ts @@ -16,28 +16,29 @@ import type { LegendREPLApplicationStore } from '../../LegendREPLBaseStore.js'; import type { DataCubeState } from '../DataCubeState.js'; -import type { DataCubeEngine } from './DataCubeEngine.js'; import type { DataCubeQuerySnapshot } from './DataCubeQuerySnapshot.js'; export abstract class DataCubeQuerySnapshotSubscriber { readonly dataCube!: DataCubeState; readonly application!: LegendREPLApplicationStore; - readonly engine!: DataCubeEngine; private latestSnapshot: DataCubeQuerySnapshot | undefined; constructor(dataCube: DataCubeState) { this.dataCube = dataCube; this.application = dataCube.application; - this.engine = dataCube.engine; } - abstract applySnapshot(snapshot: DataCubeQuerySnapshot): Promise; + abstract applySnapshot( + snapshot: DataCubeQuerySnapshot, + previousSnapshot: DataCubeQuerySnapshot | undefined, + ): Promise; abstract initialize(): Promise; async receiveSnapshot(snapshot: DataCubeQuerySnapshot): Promise { + const previousSnapshot = this.latestSnapshot; this.latestSnapshot = snapshot; - await this.applySnapshot(snapshot); + await this.applySnapshot(snapshot, previousSnapshot); } publishSnapshot(snapshot: DataCubeQuerySnapshot): void { diff --git a/packages/legend-application-repl/src/stores/dataCube/core/__tests__/DataCubeQueryAnalyzer.repl-test.ts b/packages/legend-application-repl/src/stores/dataCube/core/__tests__/DataCubeQueryAnalyzer.repl-test.ts index 7d94b53ff9..6c62989978 100644 --- a/packages/legend-application-repl/src/stores/dataCube/core/__tests__/DataCubeQueryAnalyzer.repl-test.ts +++ b/packages/legend-application-repl/src/stores/dataCube/core/__tests__/DataCubeQueryAnalyzer.repl-test.ts @@ -51,14 +51,14 @@ const cases: BaseSnapshotAnalysisTestCase[] = [ ['Valid: sort()', 'sort([~a->ascending()])', ['a:Integer'], ''], ['Valid: limit()', 'limit(10)', [], ''], [ - 'Valid: Usage - Filter: extend()->filter()->sort()->limit()', - 'extend(~[a:x|1])->filter(x|$x.a==1)->sort([ascending(~a)])->limit(10)', + 'Valid: Usage - Filter: filter()->extend()->sort()->limit()', + 'filter(x|$x.a==1)->extend(~[a:x|1])->sort([ascending(~a)])->limit(10)', ['a:Integer'], '', ], [ - 'Valid: Usage - Column Selection: extend()->select()->filter()->sort()->limit()', - 'extend(~[a:x|1])->select(~[a])->filter(x|$x.a==1)->sort([ascending(~a)])->limit(10)', + 'Valid: Usage - Column Selection: filter()->extend()->select()->sort()->limit()', + 'filter(x|$x.a==1)->extend(~[a:x|1])->select(~[a])->sort([ascending(~a)])->limit(10)', ['a:Integer'], '', ], @@ -106,11 +106,11 @@ const cases: BaseSnapshotAnalysisTestCase[] = [ 'Invalid: Unsupported function composition: filter()->extend()->filter()', 'filter(x|$x.a==1)->extend(~[a:x|1])->filter(x|$x.a==1)', [], - 'Unsupported function composition filter()->extend()->filter() (supported composition: extend()->select()->filter()->groupBy()->pivot()->cast()->extend()->sort()->limit())', + 'Unsupported function composition filter()->extend()->filter() (supported composition: filter()->extend()->select()->groupBy()->pivot()->cast()->extend()->sort()->limit())', ], [ 'Invalid: Group-level extend() used when no aggregation/grouping presents', - 'extend(~[a:x|1])->filter(x|$x.a==1)->extend(~[b:x|1])', + 'filter(x|$x.a==1)->extend(~[a:x|1])->extend(~[b:x|1])', [], 'Found invalid usage of group-level extend() for query without aggregation such as pivot() and groupBy()', ], diff --git a/packages/legend-application-repl/src/stores/dataCube/editor/DataCubeEditorColumnPropertiesPanelState.ts b/packages/legend-application-repl/src/stores/dataCube/editor/DataCubeEditorColumnPropertiesPanelState.ts index 0d7ad991f9..8594eac2d3 100644 --- a/packages/legend-application-repl/src/stores/dataCube/editor/DataCubeEditorColumnPropertiesPanelState.ts +++ b/packages/legend-application-repl/src/stores/dataCube/editor/DataCubeEditorColumnPropertiesPanelState.ts @@ -30,6 +30,7 @@ export class DataCubeEditorColumnPropertiesPanelState columns: DataCubeMutableColumnConfiguration[] = []; selectedColumnName?: string | undefined; + showAdvancedSettings = false; constructor(editor: DataCubeEditorState) { makeObservable(this, { @@ -39,12 +40,21 @@ export class DataCubeEditorColumnPropertiesPanelState selectedColumnName: observable, setSelectedColumnName: action, selectedColumn: computed, + + showAdvancedSettings: observable, + setShowAdvancedSettings: action, }); this.editor = editor; this.dataCube = editor.dataCube; } + getColumnConfiguration( + colName: string | undefined, + ): DataCubeMutableColumnConfiguration | undefined { + return this.columns.find((col) => col.name === colName); + } + setColumns(val: DataCubeMutableColumnConfiguration[]): void { this.columns = val; } @@ -59,6 +69,10 @@ export class DataCubeEditorColumnPropertiesPanelState ); } + setShowAdvancedSettings(val: boolean): void { + this.showAdvancedSettings = val; + } + applySnaphot(snapshot: DataCubeQuerySnapshot): void { this.setColumns( (snapshot.data.configuration as { columns: PlainObject[] }).columns.map( diff --git a/packages/legend-application-repl/src/stores/dataCube/editor/DataCubeEditorState.ts b/packages/legend-application-repl/src/stores/dataCube/editor/DataCubeEditorState.ts index 73d4fe9814..78bbf47199 100644 --- a/packages/legend-application-repl/src/stores/dataCube/editor/DataCubeEditorState.ts +++ b/packages/legend-application-repl/src/stores/dataCube/editor/DataCubeEditorState.ts @@ -20,9 +20,10 @@ import { DataCubeEditorSortsPanelState } from './DataCubeEditorSortsPanelState.j import { DataCubeEditorCodePanelState } from './DataCubeEditorCodePanelState.js'; import { DataCubeQuerySnapshotSubscriber } from '../core/DataCubeQuerySnapshotSubscriber.js'; import { type DataCubeQuerySnapshot } from '../core/DataCubeQuerySnapshot.js'; -import { guaranteeNonNullable } from '@finos/legend-shared'; +import { guaranteeNonNullable, uuid } from '@finos/legend-shared'; import { DataCubeEditorGeneralPropertiesPanelState } from './DataCubeEditorGeneralPropertiesPanelState.js'; import { DataCubeEditorColumnPropertiesPanelState } from './DataCubeEditorColumnPropertiesPanelState.js'; +import type { REPLWindowConfig } from '../../../components/REPLWindow.js'; export enum DATA_CUBE_EDITOR_TAB { COLUMNS = 'Columns', @@ -34,14 +35,19 @@ export enum DATA_CUBE_EDITOR_TAB { GENERAL_PROPERTIES = 'General Properties', COLUMN_PROPERTIES = 'Column Properties', CODE = 'Code', - DEVELOPER = 'Developer', } export class DataCubeEditorState extends DataCubeQuerySnapshotSubscriber { - readonly sortsPanel: DataCubeEditorSortsPanelState; - readonly generalPropertiesPanel: DataCubeEditorGeneralPropertiesPanelState; - readonly columnPropertiesPanel: DataCubeEditorColumnPropertiesPanelState; - readonly codePanel: DataCubeEditorCodePanelState; + readonly sorts: DataCubeEditorSortsPanelState; + readonly generalProperties: DataCubeEditorGeneralPropertiesPanelState; + readonly columnProperties: DataCubeEditorColumnPropertiesPanelState; + readonly code: DataCubeEditorCodePanelState; + + readonly window: REPLWindowConfig = { + uuid: uuid(), + title: 'Properties', + center: true, + }; isPanelOpen = false; currentTab = DATA_CUBE_EDITOR_TAB.GENERAL_PROPERTIES; @@ -60,14 +66,12 @@ export class DataCubeEditorState extends DataCubeQuerySnapshotSubscriber { closePanel: action, }); - this.sortsPanel = new DataCubeEditorSortsPanelState(this); - this.generalPropertiesPanel = new DataCubeEditorGeneralPropertiesPanelState( - this, - ); - this.columnPropertiesPanel = new DataCubeEditorColumnPropertiesPanelState( + this.sorts = new DataCubeEditorSortsPanelState(this); + this.generalProperties = new DataCubeEditorGeneralPropertiesPanelState( this, ); - this.codePanel = new DataCubeEditorCodePanelState(this); + this.columnProperties = new DataCubeEditorColumnPropertiesPanelState(this); + this.code = new DataCubeEditorCodePanelState(this); } openPanel(): void { @@ -86,11 +90,11 @@ export class DataCubeEditorState extends DataCubeQuerySnapshotSubscriber { const baseSnapshot = guaranteeNonNullable(this.getLatestSnapshot()); const snapshot = baseSnapshot.clone(); - this.sortsPanel.buildSnapshot(snapshot, baseSnapshot); + this.sorts.buildSnapshot(snapshot, baseSnapshot); // NOTE: snapshot must be processed first to build the container configuration // before proceeding to process the columns' configuration - this.generalPropertiesPanel.buildSnapshot(snapshot, baseSnapshot); - this.columnPropertiesPanel.buildSnapshot(snapshot, baseSnapshot); + this.generalProperties.buildSnapshot(snapshot, baseSnapshot); + this.columnProperties.buildSnapshot(snapshot, baseSnapshot); snapshot.finalize(); if (snapshot.hashCode !== baseSnapshot.hashCode) { @@ -98,10 +102,13 @@ export class DataCubeEditorState extends DataCubeQuerySnapshotSubscriber { } } - override async applySnapshot(snapshot: DataCubeQuerySnapshot): Promise { - this.sortsPanel.applySnaphot(snapshot); - this.generalPropertiesPanel.applySnaphot(snapshot); - this.columnPropertiesPanel.applySnaphot(snapshot); + override async applySnapshot( + snapshot: DataCubeQuerySnapshot, + previousSnapshot: DataCubeQuerySnapshot | undefined, + ): Promise { + this.sorts.applySnaphot(snapshot); + this.generalProperties.applySnaphot(snapshot); + this.columnProperties.applySnaphot(snapshot); } override async initialize(): Promise { diff --git a/packages/legend-application-repl/src/stores/dataCube/editor/DataCubeMutableConfiguration.ts b/packages/legend-application-repl/src/stores/dataCube/editor/DataCubeMutableConfiguration.ts index f540b4568b..b42ba1957a 100644 --- a/packages/legend-application-repl/src/stores/dataCube/editor/DataCubeMutableConfiguration.ts +++ b/packages/legend-application-repl/src/stores/dataCube/editor/DataCubeMutableConfiguration.ts @@ -21,13 +21,26 @@ import { type DataCubeAggregateFunction, type DataCubeNumberScale, type DataCubeSelectionStat, - type DataCubeFontFormatUnderlinedVariant, + type DataCubeFontFormatUnderlineVariant, + type DataCubeFontCase, type DataCubeFontTextAlignment, type DataCubeColumnDataType, type DataCubeColumnPinPlacement, + DEFAULT_FONT_FAMILY, + DEFAULT_FONT_SIZE, + DEFAULT_FONT_BOLD, + DEFAULT_FONT_ITALIC, + DEFAULT_FONT_UNDERLINED, + DEFAULT_FONT_STRIKETHROUGH, + DEFAULT_TEXT_ALIGN, + DEFAULT_FOREGROUND_COLOR, + DEFAULT_NEGATIVE_FOREGROUND_COLOR, + DEFAULT_ZERO_FOREGROUND_COLOR, + DEFAULT_ERROR_FOREGROUND_COLOR, + DEFAULT_BACKGROUND_COLOR, } from '../core/DataCubeQueryEngine.js'; import { type PlainObject, type Writable } from '@finos/legend-shared'; -import { makeObservable, observable, action } from 'mobx'; +import { makeObservable, observable, action, computed } from 'mobx'; import { DataCubeColumnConfiguration, DataCubeConfiguration, @@ -35,7 +48,6 @@ import { export class DataCubeMutableColumnConfiguration extends DataCubeColumnConfiguration { aggregateFunction?: DataCubeAggregateFunction | undefined; - weightColumn?: string | undefined; excludedFromHPivot = true; readonly dataType!: DataCubeColumnDataType; @@ -84,38 +96,41 @@ export class DataCubeMutableColumnConfiguration extends DataCubeColumnConfigurat fontItalic: observable, setFontItalic: action, - fontUnderlined: observable, - setFontUnderlined: action, + fontUnderline: observable, + setFontUnderline: action, fontStrikethrough: observable, setFontStrikethrough: action, + fontCase: observable, + setFontCase: action, + textAlign: observable, setTextAlign: action, - foregroundColor: observable, - setForegroundColor: action, + normalForegroundColor: observable, + setNormalForegroundColor: action, - foregroundNegativeColor: observable, - setForegroundNegativeColor: action, + negativeForegroundColor: observable, + setNegativeForegroundColor: action, - foregroundZeroColor: observable, - setForegroundZeroColor: action, + zeroForegroundColor: observable, + setZeroForegroundColor: action, - foregroundErrorColor: observable, - setForegroundErrorColor: action, + errorForegroundColor: observable, + setErrorForegroundColor: action, - backgroundColor: observable, - setBackgroundColor: action, + normalBackgroundColor: observable, + setNormalBackgroundColor: action, - backgroundNegativeColor: observable, - setBackgroundNegativeColor: action, + negativeBackgroundColor: observable, + setNegativeBackgroundColor: action, - backgroundZeroColor: observable, - setBackgroundZeroColor: action, + zeroBackgroundColor: observable, + setZeroBackgroundColor: action, - backgroundErrorColor: observable, - setBackgroundErrorColor: action, + errorBackgroundColor: observable, + setErrorBackgroundColor: action, blur: observable, setBlur: action, @@ -126,9 +141,6 @@ export class DataCubeMutableColumnConfiguration extends DataCubeColumnConfigurat aggregateFunction: observable, setAggregateFunction: action, - weightColumn: observable, - setWeightColumn: action, - excludedFromHPivot: observable, setExcludedFromHPivot: action, @@ -146,6 +158,12 @@ export class DataCubeMutableColumnConfiguration extends DataCubeColumnConfigurat displayAsLink: observable, setDisplayAsLink: action, + + linkLabelParameter: observable, + setLinkLabelParameter: action, + + isUsingDefaultStyling: computed, + useDefaultStyling: action, }); return configuration; @@ -155,6 +173,44 @@ export class DataCubeMutableColumnConfiguration extends DataCubeColumnConfigurat return DataCubeColumnConfiguration.serialization.toJson(this); } + get isUsingDefaultStyling(): boolean { + return ( + this.fontFamily === undefined && + this.fontSize === undefined && + this.fontBold === undefined && + this.fontItalic === undefined && + this.fontUnderline === undefined && + this.fontStrikethrough === undefined && + this.textAlign === undefined && + this.normalForegroundColor === undefined && + this.negativeForegroundColor === undefined && + this.zeroForegroundColor === undefined && + this.errorForegroundColor === undefined && + this.normalBackgroundColor === undefined && + this.negativeBackgroundColor === undefined && + this.zeroBackgroundColor === undefined && + this.errorBackgroundColor === undefined + ); + } + + useDefaultStyling(): void { + this.fontFamily = undefined; + this.fontSize = undefined; + this.fontBold = undefined; + this.fontItalic = undefined; + this.fontUnderline = undefined; + this.fontStrikethrough = undefined; + this.textAlign = undefined; + this.normalForegroundColor = undefined; + this.negativeForegroundColor = undefined; + this.zeroForegroundColor = undefined; + this.errorForegroundColor = undefined; + this.normalBackgroundColor = undefined; + this.negativeBackgroundColor = undefined; + this.zeroBackgroundColor = undefined; + this.errorBackgroundColor = undefined; + } + setKind(value: DataCubeColumnKind): void { this.kind = value; } @@ -183,66 +239,70 @@ export class DataCubeMutableColumnConfiguration extends DataCubeColumnConfigurat this.hPivotSortFunction = value; } - setFontFamily(value: DataCubeFont): void { + setFontFamily(value: DataCubeFont | undefined): void { this.fontFamily = value; } - setFontSize(value: number): void { + setFontSize(value: number | undefined): void { this.fontSize = value; } - setFontBold(value: boolean): void { + setFontBold(value: boolean | undefined): void { this.fontBold = value; } - setFontItalic(value: boolean): void { + setFontItalic(value: boolean | undefined): void { this.fontItalic = value; } - setFontUnderlined( - value: DataCubeFontFormatUnderlinedVariant | undefined, + setFontUnderline( + value: DataCubeFontFormatUnderlineVariant | undefined, ): void { - this.fontUnderlined = value; + this.fontUnderline = value; } - setTextAlign(value: DataCubeFontTextAlignment): void { - this.textAlign = value; + setFontStrikethrough(value: boolean | undefined): void { + this.fontStrikethrough = value; } - setFontStrikethrough(value: boolean): void { - this.fontStrikethrough = value; + setFontCase(value: DataCubeFontCase | undefined): void { + this.fontCase = value; } - setForegroundColor(value: string): void { - this.foregroundColor = value; + setTextAlign(value: DataCubeFontTextAlignment | undefined): void { + this.textAlign = value; } - setForegroundNegativeColor(value: string): void { - this.foregroundNegativeColor = value; + setNormalForegroundColor(value: string | undefined): void { + this.normalForegroundColor = value; } - setForegroundZeroColor(value: string): void { - this.foregroundZeroColor = value; + setNegativeForegroundColor(value: string | undefined): void { + this.negativeForegroundColor = value; } - setForegroundErrorColor(value: string): void { - this.foregroundErrorColor = value; + setZeroForegroundColor(value: string | undefined): void { + this.zeroForegroundColor = value; } - setBackgroundColor(value: string): void { - this.backgroundColor = value; + setErrorForegroundColor(value: string | undefined): void { + this.errorForegroundColor = value; } - setBackgroundNegativeColor(value: string): void { - this.backgroundNegativeColor = value; + setNormalBackgroundColor(value: string | undefined): void { + this.normalBackgroundColor = value; } - setBackgroundZeroColor(value: string): void { - this.backgroundZeroColor = value; + setNegativeBackgroundColor(value: string | undefined): void { + this.negativeBackgroundColor = value; } - setBackgroundErrorColor(value: string): void { - this.backgroundErrorColor = value; + setZeroBackgroundColor(value: string | undefined): void { + this.zeroBackgroundColor = value; + } + + setErrorBackgroundColor(value: string | undefined): void { + this.errorBackgroundColor = value; } setBlur(value: boolean): void { @@ -273,12 +333,12 @@ export class DataCubeMutableColumnConfiguration extends DataCubeColumnConfigurat this.displayAsLink = value; } - setAggregateFunction(value: DataCubeAggregateFunction | undefined): void { - this.aggregateFunction = value; + setLinkLabelParameter(value: string | undefined): void { + this.linkLabelParameter = value; } - setWeightColumn(value: string | undefined): void { - this.weightColumn = value; + setAggregateFunction(value: DataCubeAggregateFunction | undefined): void { + this.aggregateFunction = value; } setExcludedFromHPivot(value: boolean): void { @@ -300,59 +360,65 @@ export class DataCubeMutableConfiguration extends DataCubeConfiguration { description: observable, setDescription: action, - showTreeLine: observable, - setShowTreeLine: action, + showTreeLines: observable, + setShowTreeLines: action, - showHorizontalGridLine: observable, - setShowHorizontalGridLine: action, + showHorizontalGridLines: observable, + setShowHorizontalGridLines: action, - showVerticalGridLine: observable, - setShowVerticalGridLine: action, + showVerticalGridLines: observable, + setShowVerticalGridLines: action, - defaultFontFamily: observable, - setDefaultFontFamily: action, + gridLineColor: observable, + setGridLineColor: action, - defaultFontSize: observable, - setDefaultFontSize: action, + fontFamily: observable, + setFontFamily: action, + + fontSize: observable, + setFontSize: action, - defaultFontBold: observable, - setDefaultFontBold: action, + fontBold: observable, + setFontBold: action, + + fontItalic: observable, + setFontItalic: action, - defaultFontItalic: observable, - setDefaultFontItalic: action, + fontUnderline: observable, + setFontUnderline: action, - defaultFontUnderlined: observable, - setDefaultFontUnderlined: action, + fontStrikethrough: observable, + setFontStrikethrough: action, - defaultFontStrikethrough: observable, - setDefaultFontStrikethrough: action, + fontCase: observable, + setFontCase: action, - defaultTextAlign: observable, - setDefaultTextAlign: action, + textAlign: observable, + setTextAlign: action, - defaultForegroundColor: observable, - setDefaultForegroundColor: action, + normalForegroundColor: observable, + setNormalForegroundColor: action, - defaultForegroundNegativeColor: observable, - setDefaultForegroundNegativeColor: action, + negativeForegroundColor: observable, + setNegativeForegroundColor: action, - defaultForegroundZeroColor: observable, - setDefaultForegroundZeroColor: action, + zeroForegroundColor: observable, + setZeroForegroundColor: action, - defaultForegroundErrorColor: observable, - setDefaultForegroundErrorColor: action, + errorForegroundColor: observable, + setErrorForegroundColor: action, - defaultBackgroundColor: observable, - setDefaultBackgroundColor: action, + normalBackgroundColor: observable, + setNormalBackgroundColor: action, - defaultBackgroundNegativeColor: observable, - setDefaultBackgroundNegativeColor: action, + negativeBackgroundColor: observable, + setNegativeBackgroundColor: action, - defaultBackgroundZeroColor: observable, - setDefaultBackgroundZeroColor: action, + zeroBackgroundColor: observable, + setZeroBackgroundColor: action, - defaultBackgroundErrorColor: observable, - setDefaultBackgroundErrorColor: action, + errorBackgroundColor: observable, + setErrorBackgroundColor: action, alternateRows: observable, setAlternateRows: action, @@ -363,15 +429,12 @@ export class DataCubeMutableConfiguration extends DataCubeConfiguration { alternateRowsCount: observable, setAlternateRowsCount: action, - numberScale: observable, - setNumberScale: action, + alternateRowsStandardMode: observable, + setAlternateRowsStandardMode: action, selectionStats: observable, setSelectionStats: action, - rowBuffer: observable, - setRowBuffer: action, - showWarningForTruncatedResult: observable, setShowWarningForTruncatedResult: action, @@ -392,11 +455,52 @@ export class DataCubeMutableConfiguration extends DataCubeConfiguration { treeGroupSortFunction: observable, setTreeGroupSortFunction: action, + + isUsingDefaultStyling: computed, + useDefaultStyling: action, }); return configuration; } + get isUsingDefaultStyling(): boolean { + return ( + this.fontFamily === DEFAULT_FONT_FAMILY && + this.fontSize === DEFAULT_FONT_SIZE && + this.fontBold === DEFAULT_FONT_BOLD && + this.fontItalic === DEFAULT_FONT_ITALIC && + this.fontUnderline === DEFAULT_FONT_UNDERLINED && + this.fontStrikethrough === DEFAULT_FONT_STRIKETHROUGH && + this.textAlign === DEFAULT_TEXT_ALIGN && + this.normalForegroundColor === DEFAULT_FOREGROUND_COLOR && + this.negativeForegroundColor === DEFAULT_NEGATIVE_FOREGROUND_COLOR && + this.zeroForegroundColor === DEFAULT_ZERO_FOREGROUND_COLOR && + this.errorForegroundColor === DEFAULT_ERROR_FOREGROUND_COLOR && + this.normalBackgroundColor === DEFAULT_BACKGROUND_COLOR && + this.negativeBackgroundColor === DEFAULT_BACKGROUND_COLOR && + this.zeroBackgroundColor === DEFAULT_BACKGROUND_COLOR && + this.errorBackgroundColor === DEFAULT_BACKGROUND_COLOR + ); + } + + useDefaultStyling(): void { + this.fontFamily = DEFAULT_FONT_FAMILY; + this.fontSize = DEFAULT_FONT_SIZE; + this.fontBold = DEFAULT_FONT_BOLD; + this.fontItalic = DEFAULT_FONT_ITALIC; + this.fontUnderline = DEFAULT_FONT_UNDERLINED; + this.fontStrikethrough = DEFAULT_FONT_STRIKETHROUGH; + this.textAlign = DEFAULT_TEXT_ALIGN; + this.normalForegroundColor = DEFAULT_FOREGROUND_COLOR; + this.negativeForegroundColor = DEFAULT_NEGATIVE_FOREGROUND_COLOR; + this.zeroForegroundColor = DEFAULT_ZERO_FOREGROUND_COLOR; + this.errorForegroundColor = DEFAULT_ERROR_FOREGROUND_COLOR; + this.normalBackgroundColor = DEFAULT_BACKGROUND_COLOR; + this.negativeBackgroundColor = DEFAULT_BACKGROUND_COLOR; + this.zeroBackgroundColor = DEFAULT_BACKGROUND_COLOR; + this.errorBackgroundColor = DEFAULT_BACKGROUND_COLOR; + } + serialize(): PlainObject { return DataCubeConfiguration.serialization.toJson(this); } @@ -405,78 +509,86 @@ export class DataCubeMutableConfiguration extends DataCubeConfiguration { this.description = value; } - setShowTreeLine(value: boolean): void { - this.showTreeLine = value; + setShowTreeLines(value: boolean): void { + this.showTreeLines = value; + } + + setShowHorizontalGridLines(value: boolean): void { + this.showHorizontalGridLines = value; } - setShowHorizontalGridLine(value: boolean): void { - this.showHorizontalGridLine = value; + setShowVerticalGridLines(value: boolean): void { + this.showVerticalGridLines = value; } - setShowVerticalGridLine(value: boolean): void { - this.showVerticalGridLine = value; + setGridLineColor(value: string): void { + this.gridLineColor = value; } - setDefaultFontFamily(value: DataCubeFont): void { - this.defaultFontFamily = value; + setFontFamily(value: DataCubeFont): void { + this.fontFamily = value; } - setDefaultFontSize(value: number): void { - this.defaultFontSize = value; + setFontSize(value: number): void { + this.fontSize = value; } - setDefaultFontBold(value: boolean): void { - this.defaultFontBold = value; + setFontBold(value: boolean): void { + this.fontBold = value; } - setDefaultFontItalic(value: boolean): void { - this.defaultFontItalic = value; + setFontItalic(value: boolean): void { + this.fontItalic = value; } - setDefaultFontUnderlined( - value: DataCubeFontFormatUnderlinedVariant | undefined, + setFontUnderline( + value: DataCubeFontFormatUnderlineVariant | undefined, ): void { - this.defaultFontUnderlined = value; + this.fontUnderline = value; } - setDefaultFontStrikethrough(value: boolean): void { - this.defaultFontStrikethrough = value; + setFontStrikethrough(value: boolean): void { + this.fontStrikethrough = value; } - setDefaultTextAlign(value: DataCubeFontTextAlignment): void { - this.defaultTextAlign = value; + setFontCase(value: DataCubeFontCase | undefined): void { + this.fontCase = value; } - setDefaultForegroundColor(value: string): void { - this.defaultForegroundColor = value; + setTextAlign(value: DataCubeFontTextAlignment): void { + this.textAlign = value; + } + + setNormalForegroundColor(value: string): void { + this.normalForegroundColor = value; } - setDefaultForegroundNegativeColor(value: string): void { - this.defaultForegroundNegativeColor = value; + setNegativeForegroundColor(value: string): void { + this.negativeForegroundColor = value; } - setDefaultForegroundZeroColor(value: string): void { - this.defaultForegroundZeroColor = value; + setZeroForegroundColor(value: string): void { + this.zeroForegroundColor = value; } - setDefaultForegroundErrorColor(value: string): void { - this.defaultForegroundErrorColor = value; + setErrorForegroundColor(value: string): void { + this.errorForegroundColor = value; } - setDefaultBackgroundColor(value: string): void { - this.defaultBackgroundColor = value; + setNormalBackgroundColor(value: string): void { + this.normalBackgroundColor = value; } - setDefaultBackgroundNegativeColor(value: string): void { - this.defaultBackgroundNegativeColor = value; + setNegativeBackgroundColor(value: string): void { + this.negativeBackgroundColor = value; } - setDefaultBackgroundZeroColor(value: string): void { - this.defaultBackgroundZeroColor = value; + setZeroBackgroundColor(value: string): void { + this.zeroBackgroundColor = value; } - setDefaultBackgroundErrorColor(value: string): void { - this.defaultBackgroundErrorColor = value; + setErrorBackgroundColor(value: string): void { + this.errorBackgroundColor = value; } setAlternateRows(value: boolean): void { @@ -491,18 +603,14 @@ export class DataCubeMutableConfiguration extends DataCubeConfiguration { this.alternateRowsCount = value; } - setNumberScale(value: DataCubeNumberScale | undefined): void { - this.numberScale = value; + setAlternateRowsStandardMode(value: boolean): void { + this.alternateRowsStandardMode = value; } setSelectionStats(value: DataCubeSelectionStat[]): void { this.selectionStats = value; } - setRowBuffer(value: number): void { - this.rowBuffer = value; - } - setShowWarningForTruncatedResult(value: boolean): void { this.showWarningForTruncatedResult = value; } diff --git a/packages/legend-application-repl/src/stores/dataCube/grid/DataCubeGridClientEngine.ts b/packages/legend-application-repl/src/stores/dataCube/grid/DataCubeGridClientEngine.ts index 85365903a5..ad98927cf5 100644 --- a/packages/legend-application-repl/src/stores/dataCube/grid/DataCubeGridClientEngine.ts +++ b/packages/legend-application-repl/src/stores/dataCube/grid/DataCubeGridClientEngine.ts @@ -33,18 +33,71 @@ import { APPLICATION_EVENT } from '@finos/legend-application'; import { buildQuerySnapshot } from './DataCubeGridQuerySnapshotBuilder.js'; import { generateRowGroupingDrilldownExecutableQueryPostProcessor } from './DataCubeGridQueryBuilder.js'; import { makeObservable, observable, runInAction } from 'mobx'; +import type { DataCubeConfigurationColorKey } from '../core/DataCubeConfiguration.js'; type GridClientCellValue = string | number | boolean | null | undefined; type GridClientRowData = { [key: string]: GridClientCellValue; }; +export enum INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME { + ROOT = 'data-cube-grid.ag-theme-balham', + HIGHLIGHT_ROW = 'data-cube-grid__utility--highlight-row', + SHOW_VERTICAL_GRID_LINES = 'data-cube-grid__utility--show-vertical-grid-lines', + SHOW_HORIZONTAL_GRID_LINES = 'data-cube-grid__utility--show-horizontal-grid-lines', + + BLUR = 'data-cube-grid__utility--blur', + + FONT_FAMILY_PREFIX = 'data-cube-grid__utility--font-family-', + FONT_SIZE_PREFIX = 'data-cube-grid__utility--font-size-', + FONT_BOLD = 'data-cube-grid__utility--font-style-bold', + FONT_ITALIC = 'data-cube-grid__utility--font-style-italic', + FONT_UNDERLINE_PREFIX = 'data-cube-grid__utility--font-style-underline-', + FONT_STRIKETHROUGH = 'data-cube-grid__utility--font-style-strikethrough', + FONT_CASE_PREFIX = 'data-cube-grid__utility--font-style-case-', + TEXT_ALIGN_PREFIX = 'data-cube-grid__utility--text-align-', + TEXT_COLOR_PREFIX = 'data-cube-grid__utility--text-color-', + BACKGROUND_COLOR_PREFIX = 'data-cube-grid__utility--background-color-', +} +export const generateFontFamilyUtilityClassName = (fontFamily: string) => + `${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.FONT_FAMILY_PREFIX}${fontFamily.replaceAll(' ', '-')}`; +export const generateFontSizeUtilityClassName = (fontSize: number) => + `${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.FONT_SIZE_PREFIX}${fontSize}`; +export const generateFontUnderlineUtilityClassName = ( + variant: string | undefined, +) => + `${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.FONT_UNDERLINE_PREFIX}${variant ?? 'none'}`; +export const generateFontCaseUtilityClassName = ( + fontCase: string | undefined, +) => + `${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.FONT_CASE_PREFIX}${fontCase ?? 'none'}`; +export const generateTextAlignUtilityClassName = (alignment: string) => + `${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.TEXT_ALIGN_PREFIX}${alignment}`; +export const generateTextColorUtilityClassName = ( + color: string, + key: DataCubeConfigurationColorKey, +) => + `${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.TEXT_COLOR_PREFIX}${key}-${color.substring(1)}`; +export const generateBackgroundColorUtilityClassName = ( + color: string, + key: DataCubeConfigurationColorKey, +) => + `${INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.BACKGROUND_COLOR_PREFIX}${key}-${color.substring(1)}`; + +export const INTERNAL__GRID_CLIENT_COLUMN_MIN_WIDTH = 50; export const INTERNAL__GRID_CLIENT_HEADER_HEIGHT = 24; export const INTERNAL__GRID_CLIENT_ROW_HEIGHT = 20; +export const INTERNAL__GRID_CLIENT_TOOLTIP_SHOW_DELAY = 1000; +export const INTERNAL__GRID_CLIENT_AUTO_RESIZE_PADDING = 10; export const INTERNAL__GRID_CLIENT_TREE_COLUMN_ID = 'INTERNAL__tree'; export const INTERNAL__GRID_CLIENT_ROW_GROUPING_COUNT_AGG_COLUMN_ID = 'INTERNAL__count'; +export enum GridClientPinnedAlignement { + LEFT = 'left', + RIGHT = 'right', +} + export enum GridClientSortDirection { ASCENDING = 'asc', DESCENDING = 'desc', @@ -162,7 +215,8 @@ export class DataCubeGridClientServerSideDataSource }); const lambda = new V1_Lambda(); lambda.body.push(executableQuery); - const result = await this.grid.dataCube.engine.executeQuery(lambda); + const result = + await this.grid.dataCube.infrastructure.engine.executeQuery(lambda); const rowData = TDStoRowData(result.result); if (this.grid.isPaginationEnabled) { params.success({ rowData }); diff --git a/packages/legend-application-repl/src/stores/dataCube/grid/DataCubeGridQuerySnapshotAnalyzer.tsx b/packages/legend-application-repl/src/stores/dataCube/grid/DataCubeGridQuerySnapshotAnalyzer.tsx index edd2fcd4f5..1d936f69d9 100644 --- a/packages/legend-application-repl/src/stores/dataCube/grid/DataCubeGridQuerySnapshotAnalyzer.tsx +++ b/packages/legend-application-repl/src/stores/dataCube/grid/DataCubeGridQuerySnapshotAnalyzer.tsx @@ -28,18 +28,79 @@ import { type DataCubeQuerySnapshot, type DataCubeQuerySnapshotColumn, } from '../core/DataCubeQuerySnapshot.js'; -import type { ColDef, ColGroupDef, GridOptions } from '@ag-grid-community/core'; +import type { + ColDef, + ColGroupDef, + GridOptions, + ICellRendererParams, +} from '@ag-grid-community/core'; import { INTERNAL__GRID_CLIENT_TREE_COLUMN_ID, GridClientAggregateOperation, GridClientSortDirection, + INTERNAL__GRID_CLIENT_COLUMN_MIN_WIDTH, + INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME, + generateFontFamilyUtilityClassName, + generateFontSizeUtilityClassName, + generateFontUnderlineUtilityClassName, + generateTextAlignUtilityClassName, + generateTextColorUtilityClassName, + generateBackgroundColorUtilityClassName, + generateFontCaseUtilityClassName, + GridClientPinnedAlignement, + INTERNAL__GRID_CLIENT_ROW_HEIGHT, + INTERNAL__GRID_CLIENT_AUTO_RESIZE_PADDING, + INTERNAL__GRID_CLIENT_HEADER_HEIGHT, + INTERNAL__GRID_CLIENT_TOOLTIP_SHOW_DELAY, } from './DataCubeGridClientEngine.js'; import { PRIMITIVE_TYPE } from '@finos/legend-graph'; -import { IllegalStateError } from '@finos/legend-shared'; +import { + getQueryParameters, + getQueryParameterValue, + guaranteeNonNullable, + IllegalStateError, + isNonNullable, + isNumber, + isValidUrl, +} from '@finos/legend-shared'; +import type { + DataCubeColumnConfiguration, + DataCubeConfiguration, +} from '../core/DataCubeConfiguration.js'; +import { + DataCubeColumnDataType, + DataCubeColumnPinPlacement, + DataCubeNumberScale, + DEFAULT_ROW_BUFFER, + DEFAULT_URL_LABEL_QUERY_PARAM, + getDataType, +} from '../core/DataCubeQueryEngine.js'; +import type { CustomLoadingCellRendererProps } from '@ag-grid-community/react'; +import { DataCubeIcon } from '@finos/legend-art'; +import type { DataCubeState } from '../DataCubeState.js'; +import { buildGridMenu } from '../../../components/dataCube/grid/menu/DataCubeGridMenu.js'; // --------------------------------- UTILITIES --------------------------------- -function _allowedAggFuncs(column: DataCubeQuerySnapshotColumn): string[] { +// See https://www.ag-grid.com/javascript-data-grid/cell-data-types/ +function _cellDataType(column: DataCubeQuerySnapshotColumn) { + switch (column.type) { + case PRIMITIVE_TYPE.NUMBER: + case PRIMITIVE_TYPE.DECIMAL: + case PRIMITIVE_TYPE.INTEGER: + case PRIMITIVE_TYPE.FLOAT: + return 'number'; + case PRIMITIVE_TYPE.DATE: + case PRIMITIVE_TYPE.DATETIME: + case PRIMITIVE_TYPE.STRICTDATE: + return 'dateString'; + case PRIMITIVE_TYPE.STRING: + default: + return 'text'; + } +} + +function _allowedAggFuncs(column: DataCubeQuerySnapshotColumn) { switch (column.type) { case PRIMITIVE_TYPE.STRING: return []; @@ -82,38 +143,286 @@ function _aggFunc( } } +function scaleNumber( + value: number, + type: DataCubeNumberScale | undefined, +): { value: number; unit: string | undefined } { + switch (type) { + case DataCubeNumberScale.PERCENT: + return { value: value * 1e2, unit: '%' }; + case DataCubeNumberScale.BASIS_POINT: + return { value: value * 1e4, unit: 'bp' }; + case DataCubeNumberScale.THOUSANDS: + return { value: value / 1e3, unit: 'k' }; + case DataCubeNumberScale.MILLIONS: + return { value: value / 1e6, unit: 'm' }; + case DataCubeNumberScale.BILLIONS: + return { value: value / 1e9, unit: 'b' }; + case DataCubeNumberScale.TRILLIONS: + return { value: value / 1e12, unit: 't' }; + case DataCubeNumberScale.AUTO: + return scaleNumber( + value, + value >= 1e12 + ? DataCubeNumberScale.TRILLIONS + : value >= 1e9 + ? DataCubeNumberScale.BILLIONS + : value >= 1e6 + ? DataCubeNumberScale.MILLIONS + : value >= 1e3 + ? DataCubeNumberScale.THOUSANDS + : undefined, + ); + default: + return { value, unit: undefined }; + } +} + +function DataCubeGridLoadingCellRenderer( + props: CustomLoadingCellRendererProps, +) { + if (props.node.failedLoad) { + return #ERR; + } + return ( + + + Loading + + ); +} + // --------------------------------- BUILDING BLOCKS --------------------------------- -function _sortSpec(snapshot: DataCubeQuerySnapshot, colName: string) { - const sortColumns = snapshot.data.sortColumns; - const sortCol = _findCol(sortColumns, colName); - if (!sortCol) { - return { - sort: null, - sortIndex: null, +type ColumnData = { + snapshot: DataCubeQuerySnapshot; + column: DataCubeQuerySnapshotColumn; + configuration: DataCubeColumnConfiguration; + gridConfiguration: DataCubeConfiguration; +}; + +function getCellRenderer(columnData: ColumnData) { + const { column, configuration } = columnData; + const dataType = getDataType(column.type); + if (dataType === DataCubeColumnDataType.TEXT && configuration.displayAsLink) { + return function LinkRenderer(params: ICellRendererParams) { + const isUrl = isValidUrl(params.value); + if (!isUrl) { + return params.value; + } + const url = params.value as string; + const label = getQueryParameterValue( + configuration.linkLabelParameter ?? DEFAULT_URL_LABEL_QUERY_PARAM, + getQueryParameters(url, true), + ); + return ( + + {label ?? url} + + ); }; } + return null; +} + +function _displaySpec(columnData: ColumnData) { + const { column, configuration, gridConfiguration } = columnData; + const dataType = getDataType(column.type); + const fontFamily = configuration.fontFamily ?? gridConfiguration.fontFamily; + const fontSize = configuration.fontSize ?? gridConfiguration.fontSize; + const fontBold = configuration.fontBold ?? gridConfiguration.fontBold; + const fontItalic = configuration.fontItalic ?? gridConfiguration.fontItalic; + const fontStrikethrough = + configuration.fontStrikethrough ?? gridConfiguration.fontStrikethrough; + const fontUnderline = + configuration.fontUnderline ?? gridConfiguration.fontUnderline; + const fontCase = configuration.fontCase ?? gridConfiguration.fontCase; + const textAlign = configuration.textAlign ?? gridConfiguration.textAlign; + const normalForegroundColor = + configuration.normalForegroundColor ?? + gridConfiguration.normalForegroundColor; + const normalBackgroundColor = + configuration.normalBackgroundColor ?? + gridConfiguration.normalBackgroundColor; + const negativeForegroundColor = + configuration.negativeForegroundColor ?? + gridConfiguration.negativeForegroundColor; + const negativeBackgroundColor = + configuration.negativeBackgroundColor ?? + gridConfiguration.negativeBackgroundColor; + const zeroForegroundColor = + configuration.zeroForegroundColor ?? gridConfiguration.zeroForegroundColor; + const zeroBackgroundColor = + configuration.zeroBackgroundColor ?? gridConfiguration.zeroBackgroundColor; + const errorForegroundColor = + configuration.errorForegroundColor ?? + gridConfiguration.errorForegroundColor; + const errorBackgroundColor = + configuration.errorBackgroundColor ?? + gridConfiguration.errorBackgroundColor; + const cellRenderer = getCellRenderer(columnData); + return { + // setting the cell data type might helps guide the grid to render the cell properly + // and optimize the grid performance slightly by avoiding unnecessary type inference + cellDataType: _cellDataType(column), + valueFormatter: + dataType === DataCubeColumnDataType.NUMBER + ? (params) => { + const value = params.value as number | null | undefined; + if (value === null || value === undefined) { + return null; + } + const showNegativeNumberInParens = + configuration.negativeNumberInParens && value < 0; + // 1. apply the number scale + const scaledNumber = scaleNumber(value, configuration.numberScale); + // 2. apply the number formatter + const formattedValue = ( + showNegativeNumberInParens + ? Math.abs(scaledNumber.value) + : scaledNumber.value + ).toLocaleString(undefined, { + useGrouping: configuration.displayCommas, + ...(configuration.decimals !== undefined + ? { + minimumFractionDigits: configuration.decimals, + maximumFractionDigits: configuration.decimals, + } + : {}), + }); + // 3. add the parentheses (and then the unit) + return ( + (showNegativeNumberInParens + ? `(${formattedValue})` + : formattedValue) + + (scaledNumber.unit ? ` ${scaledNumber.unit}` : '') + ); + } + : (params) => params.value, + loadingCellRenderer: DataCubeGridLoadingCellRenderer, + cellClassRules: { + [generateFontFamilyUtilityClassName(fontFamily)]: () => true, + [generateFontSizeUtilityClassName(fontSize)]: () => true, + [INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.FONT_BOLD]: () => fontBold, + [INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.FONT_ITALIC]: () => + fontItalic, + [INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.FONT_STRIKETHROUGH]: () => + fontStrikethrough, + [generateFontUnderlineUtilityClassName(fontUnderline)]: () => + Boolean(fontUnderline), + [generateFontCaseUtilityClassName(fontCase)]: (params) => + dataType === DataCubeColumnDataType.TEXT && Boolean(fontCase), + [generateTextAlignUtilityClassName(textAlign)]: () => true, + [generateTextColorUtilityClassName(normalForegroundColor, 'normal')]: + () => true, + [generateBackgroundColorUtilityClassName( + normalBackgroundColor, + 'normal', + )]: () => true, + [generateTextColorUtilityClassName(zeroForegroundColor, 'zero')]: ( + params, + ) => + dataType === DataCubeColumnDataType.NUMBER && + isNumber(params.value) && + params.value === 0, + [generateBackgroundColorUtilityClassName(zeroBackgroundColor, 'zero')]: ( + params, + ) => + dataType === DataCubeColumnDataType.NUMBER && + isNumber(params.value) && + params.value === 0, + [generateTextColorUtilityClassName(negativeForegroundColor, 'negative')]: + (params) => + dataType === DataCubeColumnDataType.NUMBER && + isNumber(params.value) && + params.value < 0, + [generateBackgroundColorUtilityClassName( + negativeBackgroundColor, + 'negative', + )]: (params) => + dataType === DataCubeColumnDataType.NUMBER && + isNumber(params.value) && + params.value < 0, + [generateTextColorUtilityClassName(errorForegroundColor, 'error')]: ( + params, + ) => params.node.failedLoad, + [generateBackgroundColorUtilityClassName(errorBackgroundColor, 'error')]: + (params) => params.node.failedLoad, + [INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.BLUR]: () => + configuration.blur, + }, + cellRenderer: cellRenderer, + pinned: + configuration.pinned !== undefined + ? configuration.pinned === DataCubeColumnPinPlacement.RIGHT + ? GridClientPinnedAlignement.RIGHT + : GridClientPinnedAlignement.LEFT + : null, + tooltipValueGetter: (params) => + isNonNullable(params.value) + ? `Value = ${params.value === '' ? "''" : params.value === true ? 'TRUE' : params.value === false ? 'FALSE' : params.value}` + : `Missing Value`, + } as ColDef; +} + +function _sizeSpec(columnData: ColumnData) { + const { configuration } = columnData; return { - sort: - sortCol.operation === DataCubeQuerySnapshotSortOperation.ASCENDING + // NOTE: there is a problem with ag-grid when scrolling horizontally, the header row + // lags behind the data, it seems to be caused by synchronizing scroll not working properly + // There is currently, no way around this + // See https://github.com/ag-grid/ag-grid/issues/5233 + // See https://github.com/ag-grid/ag-grid/issues/7620 + // See https://github.com/ag-grid/ag-grid/issues/6292 + // See https://issues.chromium.org/issues/40890343#comment11 + // + // TODO: if we support column resize to fit content, should we disable this behavior? + resizable: configuration.fixedWidth === undefined, + // suppressAutoSize: columnConfiguration.fixedWidth !== undefined, + width: configuration.fixedWidth, + minWidth: Math.max( + configuration.minWidth ?? INTERNAL__GRID_CLIENT_COLUMN_MIN_WIDTH, + INTERNAL__GRID_CLIENT_COLUMN_MIN_WIDTH, + ), + maxWidth: configuration.maxWidth, + } as ColDef; +} + +function _sortSpec(columnData: ColumnData) { + const { snapshot, column } = columnData; + const sortColumns = snapshot.data.sortColumns; + const sortCol = _findCol(sortColumns, column.name); + return { + sortable: true, // if this is pivot column, no sorting is allowed + sort: sortCol + ? sortCol.operation === DataCubeQuerySnapshotSortOperation.ASCENDING ? GridClientSortDirection.ASCENDING - : GridClientSortDirection.DESCENDING, - sortIndex: sortColumns.indexOf(sortCol), - } satisfies ColDef; + : GridClientSortDirection.DESCENDING + : null, + sortIndex: sortCol ? sortColumns.indexOf(sortCol) : null, + } as ColDef; } -function _rowGroupSpec(snapshot: DataCubeQuerySnapshot, colName: string) { +function _rowGroupSpec(columnData: ColumnData) { + const { snapshot, column } = columnData; const data = snapshot.data; const columns = snapshot.stageCols('aggregation'); - const column = _findCol(columns, colName); - const groupByCol = _findCol(data.groupBy?.columns, colName); - const aggCol = _findCol(data.groupBy?.aggColumns, colName); + const rowGroupColumn = _findCol(columns, column.name); + const groupByCol = _findCol(data.groupBy?.columns, column.name); + const aggCol = _findCol(data.groupBy?.aggColumns, column.name); return { + enableRowGroup: true, + enableValue: true, rowGroup: Boolean(groupByCol), // TODO: @akphi - add this from configuration object aggFunc: aggCol ? _aggFunc(aggCol.function) - : column + : rowGroupColumn ? ( [ PRIMITIVE_TYPE.NUMBER, @@ -121,20 +430,151 @@ function _rowGroupSpec(snapshot: DataCubeQuerySnapshot, colName: string) { PRIMITIVE_TYPE.FLOAT, PRIMITIVE_TYPE.INTEGER, ] as string[] - ).includes(column.type) + ).includes(rowGroupColumn.type) ? GridClientAggregateOperation.SUM : null : null, // TODO: @akphi - add this from configuration object - allowedAggFuncs: column ? _allowedAggFuncs(column) : [], + allowedAggFuncs: rowGroupColumn ? _allowedAggFuncs(rowGroupColumn) : [], } satisfies ColDef; } +// --------------------------------- MAIN --------------------------------- + +export function generateBaseGridOptions(dataCube: DataCubeState): GridOptions { + const grid = dataCube.grid; + + return { + // -------------------------------------- README -------------------------------------- + // NOTE: we observe performance degradataion when configuring the grid via React component + // props when the options is non-static, i.e. changed when the query configuration changes. + // As such, we must ONLY ADD STATIC CONFIGURATION HERE, and dynamic configuration should be + // programatically updated when the query is modified. + // + // + // -------------------------------------- ROW GROUPING -------------------------------------- + rowGroupPanelShow: 'always', + groupDisplayType: 'custom', // keeps the column set stable even when row grouping is used + suppressRowGroupHidesColumns: true, // keeps the column set stable even when row grouping is used + suppressAggFuncInHeader: true, // keeps the columns stable when aggregation is used + // -------------------------------------- PIVOT -------------------------------------- + // pivotPanelShow: "always" + // pivotMode:true, + // -------------------------------------- SORT -------------------------------------- + // Force multi-sorting since this is what the query supports anyway + alwaysMultiSort: true, + // -------------------------------------- DISPLAY -------------------------------------- + rowHeight: INTERNAL__GRID_CLIENT_ROW_HEIGHT, + headerHeight: INTERNAL__GRID_CLIENT_HEADER_HEIGHT, + suppressBrowserResizeObserver: true, + noRowsOverlayComponent: () => ( +
+
+ +
+ 0 rows +
+ ), + loadingOverlayComponent: () => ( +
+
+ +
+ Loading... +
+ ), + // Show cursor position when scrolling + onBodyScroll: (event) => { + const rowCount = event.api.getDisplayedRowCount(); + const range = event.api.getVerticalPixelRange(); + const start = Math.max( + 1, + Math.ceil(range.top / INTERNAL__GRID_CLIENT_ROW_HEIGHT) + 1, + ); + const end = Math.min( + rowCount, + Math.floor(range.bottom / INTERNAL__GRID_CLIENT_ROW_HEIGHT), + ); + grid.setScrollHintText(`${start}-${end}/${rowCount}`); + event.api.hidePopupMenu(); // hide context-menu while scrolling + }, + onBodyScrollEnd: () => grid.setScrollHintText(''), + // -------------------------------------- CONTEXT MENU -------------------------------------- + preventDefaultOnContextMenu: true, // prevent showing the browser's context menu + columnMenu: 'new', // ensure context menu works on header + getContextMenuItems: buildGridMenu, + getMainMenuItems: buildGridMenu, + // -------------------------------------- COLUMN SIZING -------------------------------------- + autoSizePadding: INTERNAL__GRID_CLIENT_AUTO_RESIZE_PADDING, + autoSizeStrategy: { + // resize to fit content initially + type: 'fitCellContents', + }, + // -------------------------------------- TOOLTIP -------------------------------------- + tooltipShowDelay: INTERNAL__GRID_CLIENT_TOOLTIP_SHOW_DELAY, + tooltipInteraction: true, + // -------------------------------------- COLUMN MOVING -------------------------------------- + suppressDragLeaveHidesColumns: true, + // -------------------------------------- SERVER SIDE ROW MODEL -------------------------------------- + suppressScrollOnNewData: true, + suppressServerSideFullWidthLoadingRow: true, // make sure each column has its own loading indicator instead of the whole row + // -------------------------------------- SELECTION -------------------------------------- + enableRangeSelection: true, + // -------------------------------------- PERFORMANCE -------------------------------------- + animateRows: false, // improve performance + suppressColumnMoveAnimation: true, // improve performance + }; +} + export function generateGridOptionsFromSnapshot( snapshot: DataCubeQuerySnapshot, + configuration: DataCubeConfiguration, + dataCube: DataCubeState, ): GridOptions { const data = snapshot.data; - const gridOptions: GridOptions = { + const gridOptions = { + /** + * NOTE: there is a strange issue where if we put dynamic configuration directly + * such as rowClassRules which depends on some changing state (e.g. alternateRows) + * as the grid component's props, the grid performance will be heavily compromised + * while if we programatically set it like this, it does not seem so taxing to the + * performance; perhaps something to do with React component rendering on props change + * so in general for grid options which are not static, we must configure them here + */ + rowClassRules: configuration.alternateRows + ? { + [INTERNAL__GRID_CLIENT_UTILITY_CSS_CLASS_NAME.HIGHLIGHT_ROW]: ( + params, + ) => + params.rowIndex % (configuration.alternateRowsCount * 2) >= + configuration.alternateRowsCount, + } + : null, + rowBuffer: DEFAULT_ROW_BUFFER, + + // -------------------------------------- EVENT HANDLERS -------------------------------------- + + onColumnPinned: (event) => { + if (event.column) { + const column = event.column; + const columnConfiguration = + dataCube.editor.columnProperties.getColumnConfiguration( + column.getColId(), + ); + const pinned = column.getPinned(); + columnConfiguration?.setPinned( + pinned === null + ? undefined + : pinned === GridClientPinnedAlignement.LEFT + ? DataCubeColumnPinPlacement.LEFT + : DataCubeColumnPinPlacement.RIGHT, + ); + dataCube.editor.applyChanges(); + } + }, + + // -------------------------------------- COLUMNS -------------------------------------- + columnDefs: [ { headerName: '', @@ -159,34 +599,42 @@ export function generateGridOptionsFromSnapshot( hide: !snapshot.data.groupBy, lockPinned: true, lockPosition: true, + pinned: GridClientPinnedAlignement.LEFT, cellStyle: { flex: 1, justifyContent: 'space-between', display: 'flex', }, + // TODO: display: coloring, text, etc. + // TODO: pinning (should we pin this left by default?) + // TODO: tooltip + loadingCellRenderer: DataCubeGridLoadingCellRenderer, sortable: false, // TODO: @akphi - we can support this in the configuration } satisfies ColDef, - ...data.selectColumns.map( - (col) => - ({ - headerName: col.name, - field: col.name, - - // TODO: configure - flex: 1, // when the column supposed to fill the remainig space of the grid - resizable: true, - minWidth: 50, - - sortable: true, // if this is pivot column, no sorting is allowed - enableRowGroup: true, - enableValue: true, - menuTabs: ['generalMenuTab', 'columnsMenuTab'], - ..._sortSpec(snapshot, col.name), - ..._rowGroupSpec(snapshot, col.name), - }) satisfies ColDef | ColGroupDef, - ), + // TODO: handle pivot and column grouping + ...data.selectColumns.map((column) => { + const columnData = { + snapshot, + column, + configuration: guaranteeNonNullable( + configuration.columns.find((col) => col.name === column.name), + ), + gridConfiguration: configuration, + }; + return { + headerName: column.name, + field: column.name, + menuTabs: [], + suppressMovable: true, + + ..._displaySpec(columnData), + ..._sizeSpec(columnData), + ..._sortSpec(columnData), + ..._rowGroupSpec(columnData), + } satisfies ColDef | ColGroupDef; + }), ], - }; + } as GridOptions; return gridOptions; } diff --git a/packages/legend-application-repl/src/stores/dataCube/grid/DataCubeGridState.ts b/packages/legend-application-repl/src/stores/dataCube/grid/DataCubeGridState.ts index faac081294..313a52df47 100644 --- a/packages/legend-application-repl/src/stores/dataCube/grid/DataCubeGridState.ts +++ b/packages/legend-application-repl/src/stores/dataCube/grid/DataCubeGridState.ts @@ -14,34 +14,62 @@ * limitations under the License. */ -import { guaranteeNonNullable } from '@finos/legend-shared'; -import { action, makeObservable, observable } from 'mobx'; +import { guaranteeNonNullable, hashArray } from '@finos/legend-shared'; +import { action, makeObservable, observable, runInAction } from 'mobx'; import type { GridApi } from '@ag-grid-community/core'; import type { DataCubeState } from '../DataCubeState.js'; import { DataCubeGridClientServerSideDataSource } from './DataCubeGridClientEngine.js'; import { DataCubeQuerySnapshotSubscriber } from '../core/DataCubeQuerySnapshotSubscriber.js'; import type { DataCubeQuerySnapshot } from '../core/DataCubeQuerySnapshot.js'; import { generateGridOptionsFromSnapshot } from './DataCubeGridQuerySnapshotAnalyzer.js'; +import { DataCubeConfiguration } from '../core/DataCubeConfiguration.js'; + +class DataCubeGridDatasourceConfiguration { + readonly limit?: number | undefined; + + constructor(input: { + snapshot?: DataCubeQuerySnapshot | undefined; + queryConfiguration?: DataCubeConfiguration | undefined; + }) { + const { snapshot } = input; + this.limit = snapshot?.data.limit; + } + + get hashCode(): string { + return hashArray([`limit: ${this.limit ?? ''}`]); + } +} export class DataCubeGridState extends DataCubeQuerySnapshotSubscriber { private _client?: GridApi | undefined; clientDataSource: DataCubeGridClientServerSideDataSource; clientLicenseKey?: string | undefined; + isPaginationEnabled = false; + scrollHintText = ''; + datasourceConfiguration: DataCubeGridDatasourceConfiguration; + queryConfiguration: DataCubeConfiguration; constructor(dataCube: DataCubeState) { super(dataCube); makeObservable(this, { clientDataSource: observable, + datasourceConfiguration: observable, + queryConfiguration: observable, clientLicenseKey: observable, setClientLicenseKey: action, isPaginationEnabled: observable, setPaginationEnabled: action, + + scrollHintText: observable, + setScrollHintText: action, }); + this.datasourceConfiguration = new DataCubeGridDatasourceConfiguration({}); + this.queryConfiguration = new DataCubeConfiguration(); this.clientDataSource = new DataCubeGridClientServerSideDataSource(this); } @@ -52,32 +80,57 @@ export class DataCubeGridState extends DataCubeQuerySnapshotSubscriber { setPaginationEnabled(val: boolean): void { this.isPaginationEnabled = val; - // When pagination is toggled off, we don't need to reset the grid since data is - // already loaded data will still be there, but we need to collapse all expanded - // row groupings since the data there are now stale. - // Maybe, we can handle this transition more elegantly by refreshing data for all - // expanded row groupings as well, but for now, we opt for the simple mechanics. - if (!this.isPaginationEnabled) { - this.client.collapseAll(); - this.client.refreshServerSide(); - } else { - // When pagination is toggled on, we simply reset the grid to clear all data and reset scroll; - // otherwise each page that we already loaded when pagination is off will get refetched by - // server-side data source, which is expensive. - this.clientDataSource = new DataCubeGridClientServerSideDataSource(this); - } + // hard reset the grid, this will force the grid to fetch data again + // NOTE: if we don't fully reset the datasource, and say we just turned on pagination, + // for how many page that we loaded when pagination is off, the datasource + // will fire that many data fetch operations which is expensive. + this.clientDataSource = new DataCubeGridClientServerSideDataSource(this); } - configureClient(val: GridApi | undefined): void { - this._client = val; + setScrollHintText(val: string): void { + this.scrollHintText = val; } get client(): GridApi { return guaranteeNonNullable(this._client, 'Grid client is not configured'); } - override async applySnapshot(snapshot: DataCubeQuerySnapshot): Promise { - const gridOptions = generateGridOptionsFromSnapshot(snapshot); + configureClient(val: GridApi | undefined): void { + this._client = val; + } + + override async applySnapshot( + snapshot: DataCubeQuerySnapshot, + previousSnapshot: DataCubeQuerySnapshot | undefined, + ): Promise { + const existingExtraConfiguration = this.datasourceConfiguration; + const queryConfiguration = DataCubeConfiguration.serialization.fromJson( + snapshot.data.configuration, + ); + + // NOTE: if one of the change affects the structure of the data cube but cannot be captured + // in the grid client options, we will need to manually reset the grid by resetting the + // datasource to ensure we don't fetch the result twice while forcing the data to be refreshed + runInAction(() => { + this.datasourceConfiguration = new DataCubeGridDatasourceConfiguration({ + snapshot, + queryConfiguration, + }); + this.queryConfiguration = queryConfiguration; + }); + if ( + existingExtraConfiguration.hashCode !== + this.datasourceConfiguration.hashCode + ) { + // reset the entire grid + this.clientDataSource = new DataCubeGridClientServerSideDataSource(this); + } + + const gridOptions = generateGridOptionsFromSnapshot( + snapshot, + queryConfiguration, + this.dataCube, + ); this.client.updateGridOptions(gridOptions); } diff --git a/packages/legend-application-repl/style/_repl.scss b/packages/legend-application-repl/style/_repl.scss index 97e89501d4..2ae2f4395e 100644 --- a/packages/legend-application-repl/style/_repl.scss +++ b/packages/legend-application-repl/style/_repl.scss @@ -110,9 +110,14 @@ button:focus-visible { } .data-cube-color-picker--disabled { - background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1.1' preserveAspectRatio='none' viewBox='0 0 100 100' %3E%3Cpath d='M1 0 L0 1 L99 100 L100 99' stroke-width='4' stroke='%23e5e5e5' /%3E%3C/svg%3E"); + background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1.1' preserveAspectRatio='none' viewBox='0 0 100 100' %3E%3Cpath d='M0 0 L100 100' stroke-width='4' stroke='%23e5e5e5' /%3E%3C/svg%3E"); } +.data-cube-color-picker--transparent { + background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1.1' preserveAspectRatio='none' viewBox='0 0 100 100' %3E%3Cpath d='M0 100 L100 0' stroke-width='7' stroke='%23ef4444' /%3E%3C/svg%3E"); +} + +.data-cube-grid.ag-theme-balham, .data-cube-grid .ag-theme-balham { --ag-input-focus-border-color: var(--tw-color-sky-600); --ag-balham-active-color: var(--tw-color-sky-600); @@ -130,10 +135,11 @@ button:focus-visible { --ag-icon-size: 12px; --ag-font-family: 'Roboto', sans-serif; --ag-icon-font-color: var(--tw-color-neutral-500); - --ag-row-border-color: transparent; --ag-header-foreground-color: var(--tw-color-black); - --ag-odd-row-background-color: var(--tw-color-white); --ag-row-hover-color: #d4d4d415; // tailwind neutral 300 + --ag-tooltip-background-color: var(--tw-color-white); + --ag-popup-shadow: 2px 2px 5px rgb(0 0 0 / 20%); + // NOTE: These are icons taken from Tabler and URI encoded // See https://yoksel.github.io/url-encoder/ // See https://tablericons.com/ @@ -141,6 +147,37 @@ button:focus-visible { --ag-icon-font-code-group: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='icon icon-tabler icon-tabler-table-column' width='12' height='12' viewBox='0 0 24 24' stroke-width='1.5' stroke='%23000000' fill='none' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath stroke='none' d='M0 0h24v24H0z' fill='none'/%3E%3Cpath d='M3 5a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14z' /%3E%3Cpath d='M10 10h11' /%3E%3Cpath d='M10 3v18' /%3E%3Cpath d='M9 3l-6 6' /%3E%3Cpath d='M10 7l-7 7' /%3E%3Cpath d='M10 12l-7 7' /%3E%3Cpath d='M10 17l-4 4' /%3E%3C/svg%3E"); --ag-icon-font-code-pivot: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='icon icon-tabler icon-tabler-table-row' width='12' height='12' viewBox='0 0 24 24' stroke-width='1.5' stroke='%23000000' fill='none' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath stroke='none' d='M0 0h24v24H0z' fill='none'/%3E%3Cpath d='M3 5a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14z' /%3E%3Cpath d='M9 3l-6 6' /%3E%3Cpath d='M14 3l-7 7' /%3E%3Cpath d='M19 3l-7 7' /%3E%3Cpath d='M21 6l-4 4' /%3E%3Cpath d='M3 10h18' /%3E%3Cpath d='M10 10v11' /%3E%3C/svg%3E"); + // Improve visibility for pinned columns region + .ag-cell.ag-cell-last-left-pinned { + border-right: none; + } + + .ag-pinned-left-header, + .ag-pinned-left-cols-container { + border-right: 3px double var(--tw-color-neutral-400); + } + + .ag-cell.ag-cell-first-right-pinned { + border-left: none; + } + + .ag-pinned-right-header, + .ag-pinned-right-cols-container { + border-left: 3px double var(--tw-color-neutral-400); + } + + // Improve responsiveness for tooltip + .ag-tooltip { + padding: 3px 5px; + border: 1px solid var(--tw-color-neutral-500); + border-radius: 0; + } + + .ag-tooltip.ag-tooltip-animate, + .ag-tooltip-custom.ag-tooltip-animate { + transition: opacity 0.2s; + } + .ag-column-drop-cell { height: 16px; display: flex; @@ -190,8 +227,6 @@ button:focus-visible { .ag-menu-option-popup-pointer { padding: 5px 5px 5px 0; } - - // TODO: cell/range selection color } .data-cube-column-selector .ag-theme-balham { diff --git a/packages/legend-application-studio-bootstrap/package.json b/packages/legend-application-studio-bootstrap/package.json index f099fd748b..edfe01a8f0 100644 --- a/packages/legend-application-studio-bootstrap/package.json +++ b/packages/legend-application-studio-bootstrap/package.json @@ -67,9 +67,9 @@ "cross-env": "7.0.3", "eslint": "8.57.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "sass": "1.77.6", - "typescript": "5.5.2" + "typescript": "5.5.3" }, "publishConfig": { "directory": "build/publishContent" diff --git a/packages/legend-application-studio-deployment/package.json b/packages/legend-application-studio-deployment/package.json index 7a7272f328..e6a0b78e9c 100644 --- a/packages/legend-application-studio-deployment/package.json +++ b/packages/legend-application-studio-deployment/package.json @@ -42,8 +42,8 @@ "cross-env": "7.0.3", "eslint": "8.57.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", - "typescript": "5.5.2", + "rimraf": "5.0.8", + "typescript": "5.5.3", "webpack": "5.92.1", "webpack-bundle-analyzer": "4.10.2", "webpack-cli": "5.1.4", diff --git a/packages/legend-application-studio/package.json b/packages/legend-application-studio/package.json index 5613ab0bea..41cfcd3a23 100644 --- a/packages/legend-application-studio/package.json +++ b/packages/legend-application-studio/package.json @@ -55,12 +55,12 @@ "@finos/legend-server-showcase": "workspace:*", "@finos/legend-shared": "workspace:*", "@finos/legend-storage": "workspace:*", - "@testing-library/dom": "10.2.0", + "@testing-library/dom": "10.3.1", "@testing-library/react": "16.0.0", "@types/react": "18.3.3", "@types/react-dom": "18.3.0", "fast-xml-parser": "4.4.0", - "mobx": "6.12.5", + "mobx": "6.13.0", "mobx-react-lite": "4.0.7", "mobx-utils": "6.0.8", "monaco-editor": "0.50.0", @@ -78,9 +78,9 @@ "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "sass": "1.77.6", - "typescript": "5.5.2" + "typescript": "5.5.3" }, "peerDependencies": { "react": "^18.0.0" diff --git a/packages/legend-application/package.json b/packages/legend-application/package.json index 1ad8dcbe7f..9b36a07dc1 100644 --- a/packages/legend-application/package.json +++ b/packages/legend-application/package.json @@ -51,7 +51,7 @@ "@types/react-dom": "18.3.0", "@types/react-router-dom": "5.3.3", "history": "5.3.0", - "mobx": "6.12.5", + "mobx": "6.13.0", "mobx-react-lite": "4.0.7", "react": "18.3.1", "react-dnd": "16.0.1", @@ -74,9 +74,9 @@ "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "sass": "1.77.6", - "typescript": "5.5.2" + "typescript": "5.5.3" }, "peerDependencies": { "react": "^18.0.0" diff --git a/packages/legend-application/src/components/ApplicationComponentFrameworkProvider.tsx b/packages/legend-application/src/components/ApplicationComponentFrameworkProvider.tsx index 6f4b66912c..8d561e7a46 100644 --- a/packages/legend-application/src/components/ApplicationComponentFrameworkProvider.tsx +++ b/packages/legend-application/src/components/ApplicationComponentFrameworkProvider.tsx @@ -217,3 +217,59 @@ export const ApplicationComponentFrameworkProvider = observer( ); }, ); + +export const SimpleApplicationComponentFrameworkProvider = observer( + (props: { children: React.ReactNode }) => { + const { children } = props; + const applicationStore = useApplicationStore(); + const disableContextMenu: React.MouseEventHandler = (event) => { + event.stopPropagation(); + event.preventDefault(); + }; + + const keyBindingMap = buildHotkeysConfiguration( + applicationStore.keyboardShortcutsService.commandKeyMap, + (keyCombination: string, event: KeyboardEvent) => { + // prevent default from potentially clashing key combinations with platform native keyboard shortcuts + // NOTE: Though tempting since it's a good way to simplify and potentially avoid conflicts, + // we should not call `preventDefault()` because if we have any hotkey sequence which is too short, + // such as `r`, `a` - we risk blocking some very common interaction, i.e. user typing, or even + // constructing longer key combinations + if (PLATFORM_NATIVE_KEYBOARD_SHORTCUTS.includes(keyCombination)) { + event.preventDefault(); + } + applicationStore.keyboardShortcutsService.dispatch(keyCombination); + }, + ); + + useEffect(() => { + const onKeyEvent = createKeybindingsHandler(keyBindingMap); + document.addEventListener('keydown', onKeyEvent); + return () => { + document.removeEventListener('keydown', onKeyEvent); + }; + }, [keyBindingMap]); + + return ( + + +
+ + {children} +
+
+
+ ); + }, +); diff --git a/packages/legend-application/src/components/ApplicationFrameworkProvider.tsx b/packages/legend-application/src/components/ApplicationFrameworkProvider.tsx index e7c8aadc7e..6d17e63c30 100644 --- a/packages/legend-application/src/components/ApplicationFrameworkProvider.tsx +++ b/packages/legend-application/src/components/ApplicationFrameworkProvider.tsx @@ -16,13 +16,19 @@ import { useEffect } from 'react'; import { observer } from 'mobx-react-lite'; -import { ApplicationComponentFrameworkProvider } from './ApplicationComponentFrameworkProvider.js'; +import { + ApplicationComponentFrameworkProvider, + SimpleApplicationComponentFrameworkProvider, +} from './ApplicationComponentFrameworkProvider.js'; import { useApplicationStore } from './ApplicationStoreProvider.js'; import { useApplicationPlatform } from './ApplicationPlatformProvider.js'; export const ApplicationFrameworkProvider = observer( - (props: { children: React.ReactNode }): React.ReactElement => { - const { children } = props; + (props: { + children: React.ReactNode; + simple?: boolean | undefined; + }): React.ReactElement => { + const { children, simple } = props; const platform = useApplicationPlatform(); const applicationStore = useApplicationStore(); @@ -38,6 +44,13 @@ export const ApplicationFrameworkProvider = observer( // TODO: would be great if we can have here but since Mobx React is not ready for // concurrency yet, we would have to wait // See https://github.com/mobxjs/mobx/issues/2526 + if (simple) { + return ( + + {children} + + ); + } return ( {children} diff --git a/packages/legend-art/package.json b/packages/legend-art/package.json index a0ea8c979e..3c11e38875 100644 --- a/packages/legend-art/package.json +++ b/packages/legend-art/package.json @@ -58,14 +58,14 @@ "@fontsource/roboto-mono": "5.0.18", "@fontsource/roboto-serif": "5.0.13", "@fontsource/ubuntu-mono": "5.0.20", - "@mui/material": "5.15.21", + "@mui/material": "5.16.0", "@types/react": "18.3.3", "@types/react-select": "4.0.18", "@types/react-window": "1.8.8", "clsx": "2.1.1", "color-parse": "2.0.2", "mermaid": "10.9.1", - "mobx": "6.12.5", + "mobx": "6.13.0", "mobx-react-lite": "4.0.7", "react": "18.3.1", "react-colorful": "5.6.1", @@ -87,14 +87,14 @@ "devDependencies": { "@finos/legend-dev-utils": "workspace:*", "@jest/globals": "29.7.0", - "@types/react-resizable": "3.0.7", + "@types/react-resizable": "3.0.8", "cross-env": "7.0.3", "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "sass": "1.77.6", - "typescript": "5.5.2" + "typescript": "5.5.3" }, "peerDependencies": { "react": "^18.0.0" diff --git a/packages/legend-art/src/color/ColorPicker.ts b/packages/legend-art/src/color/ColorPicker.ts index 874554f806..667bd2a5bb 100644 --- a/packages/legend-art/src/color/ColorPicker.ts +++ b/packages/legend-art/src/color/ColorPicker.ts @@ -14,8 +14,12 @@ * limitations under the License. */ +import parseColor from 'color-parse'; + export { HexColorPicker, HexAlphaColorPicker, HexColorInput, } from 'react-colorful'; + +export { parseColor }; diff --git a/packages/legend-art/src/color/TailwindCSSPalette.ts b/packages/legend-art/src/color/TailwindCSSPalette.ts index c4ba61dc4c..ff35d2b135 100644 --- a/packages/legend-art/src/color/TailwindCSSPalette.ts +++ b/packages/legend-art/src/color/TailwindCSSPalette.ts @@ -21,6 +21,7 @@ export type TailwindCSSColorScaleKey = keyof typeof TailwindCSSPalette; export type TailwindCSSColorScale = (typeof TailwindCSSPalette)['slate']; export const TailwindCSSPalette = { + transparent: '#00000000', black: '#000000', white: '#ffffff', slate: { diff --git a/packages/legend-art/src/icon/DataCubeIcon.tsx b/packages/legend-art/src/icon/DataCubeIcon.tsx index 67119e8691..1216cd4c4a 100644 --- a/packages/legend-art/src/icon/DataCubeIcon.tsx +++ b/packages/legend-art/src/icon/DataCubeIcon.tsx @@ -32,6 +32,7 @@ import { PiTextAlignLeft, PiTextAlignRight, } from 'react-icons/pi'; +import { RxLetterCaseCapitalize } from 'react-icons/rx'; import { TbBook, TbCube, @@ -62,21 +63,26 @@ import { TbLoader2, TbSettingsBolt, TbSettings, + TbChevronDown, + TbCaretRightFilled, } from 'react-icons/tb'; export const DataCubeIcon = { AdvancedSettings: TbSettingsBolt, CaretDown: TbCaretDownFilled, + CaretRight: TbCaretRightFilled, Checkbox: GrCheckbox, CheckboxSelected: GrCheckboxSelected, ChevronLeft: TbChevronLeft, ChevronRight: TbChevronRight, + ChevronDown: TbChevronDown, Code: TbCode, Cube: TbCube, Documentation: TbBook, FontBold: MdOutlineFormatBold, + FontCase: RxLetterCaseCapitalize, FontItalic: MdOutlineFormatItalic, - FontUnderlined: MdOutlineFormatUnderlined, + FontUnderline: MdOutlineFormatUnderlined, FontStrikethrough: MdOutlineStrikethroughS, Loader: TbLoader2, Note: TbNote, diff --git a/packages/legend-art/src/index.ts b/packages/legend-art/src/index.ts index 232b9656ad..7b586b11be 100644 --- a/packages/legend-art/src/index.ts +++ b/packages/legend-art/src/index.ts @@ -55,14 +55,14 @@ export * from './popover/BasePopper.js'; export * from './radio-group/BaseRadioGroup.js'; -export * from './panel/Panel.js'; -export * from './panel/PanelListSelectorItem.js'; -export * from './panel/BlankPanelContent.js'; -export * from './panel/BlankPanelPlaceholder.js'; -export * from './panel/PanelLoadingIndicator.js'; -export * from './panel/PanelDropZone.js'; -export * from './panel/PanelDisplayState.js'; -export * from './panel/ResizablePanel.js'; +export * from './layout/Panel.js'; +export * from './layout/PanelListSelectorItem.js'; +export * from './layout/BlankPanelContent.js'; +export * from './layout/BlankPanelPlaceholder.js'; +export * from './layout/PanelLoadingIndicator.js'; +export * from './layout/PanelDropZone.js'; +export * from './layout/PanelDisplayState.js'; +export * from './layout/ResizablePanel.js'; export * from './loader/ProgressBar.js'; diff --git a/packages/legend-art/src/panel/BlankPanelContent.tsx b/packages/legend-art/src/layout/BlankPanelContent.tsx similarity index 100% rename from packages/legend-art/src/panel/BlankPanelContent.tsx rename to packages/legend-art/src/layout/BlankPanelContent.tsx diff --git a/packages/legend-art/src/panel/BlankPanelPlaceholder.tsx b/packages/legend-art/src/layout/BlankPanelPlaceholder.tsx similarity index 100% rename from packages/legend-art/src/panel/BlankPanelPlaceholder.tsx rename to packages/legend-art/src/layout/BlankPanelPlaceholder.tsx diff --git a/packages/legend-art/src/panel/Panel.tsx b/packages/legend-art/src/layout/Panel.tsx similarity index 100% rename from packages/legend-art/src/panel/Panel.tsx rename to packages/legend-art/src/layout/Panel.tsx diff --git a/packages/legend-art/src/panel/PanelDisplayState.ts b/packages/legend-art/src/layout/PanelDisplayState.ts similarity index 100% rename from packages/legend-art/src/panel/PanelDisplayState.ts rename to packages/legend-art/src/layout/PanelDisplayState.ts diff --git a/packages/legend-art/src/panel/PanelDropZone.tsx b/packages/legend-art/src/layout/PanelDropZone.tsx similarity index 100% rename from packages/legend-art/src/panel/PanelDropZone.tsx rename to packages/legend-art/src/layout/PanelDropZone.tsx diff --git a/packages/legend-art/src/panel/PanelListSelectorItem.tsx b/packages/legend-art/src/layout/PanelListSelectorItem.tsx similarity index 100% rename from packages/legend-art/src/panel/PanelListSelectorItem.tsx rename to packages/legend-art/src/layout/PanelListSelectorItem.tsx diff --git a/packages/legend-art/src/panel/PanelLoadingIndicator.tsx b/packages/legend-art/src/layout/PanelLoadingIndicator.tsx similarity index 100% rename from packages/legend-art/src/panel/PanelLoadingIndicator.tsx rename to packages/legend-art/src/layout/PanelLoadingIndicator.tsx diff --git a/packages/legend-art/src/panel/ResizablePanel.tsx b/packages/legend-art/src/layout/ResizablePanel.tsx similarity index 100% rename from packages/legend-art/src/panel/ResizablePanel.tsx rename to packages/legend-art/src/layout/ResizablePanel.tsx diff --git a/packages/legend-art/src/utils/ComponentUtils.ts b/packages/legend-art/src/utils/ComponentUtils.ts index 10049d0b95..963142ade5 100644 --- a/packages/legend-art/src/utils/ComponentUtils.ts +++ b/packages/legend-art/src/utils/ComponentUtils.ts @@ -36,3 +36,5 @@ export const useStateWithCallback = ( useEffect(() => callback(state), [state, callback]); return [state, setState]; }; + +export { Global, css } from '@emotion/react'; diff --git a/packages/legend-dev-utils/package.json b/packages/legend-dev-utils/package.json index 3ffc9bd73d..9df09f7d73 100644 --- a/packages/legend-dev-utils/package.json +++ b/packages/legend-dev-utils/package.json @@ -51,10 +51,10 @@ }, "dependencies": { "@babel/core": "7.24.7", - "@changesets/assemble-release-plan": "6.0.2", + "@changesets/assemble-release-plan": "6.0.3", "@changesets/changelog-github": "0.5.0", - "@changesets/config": "3.0.1", - "@changesets/get-release-plan": "4.0.2", + "@changesets/config": "3.0.2", + "@changesets/get-release-plan": "4.0.3", "@changesets/git": "3.0.0", "@changesets/logger": "0.1.0", "@changesets/read": "0.6.0", @@ -70,7 +70,7 @@ "circular-dependency-plugin": "5.2.2", "clean-webpack-plugin": "4.0.0", "css-loader": "7.1.2", - "cssnano": "7.0.3", + "cssnano": "7.0.4", "html-webpack-plugin": "5.6.0", "isbinaryfile": "5.0.2", "jest": "29.7.0", @@ -89,13 +89,13 @@ "resolve": "1.22.8", "sass": "1.77.6", "sass-loader": "14.2.1", - "typescript": "5.5.2", + "typescript": "5.5.3", "webpack": "5.92.1" }, "devDependencies": { "cross-env": "7.0.3", "eslint": "8.57.0", - "rimraf": "5.0.7" + "rimraf": "5.0.8" }, "publishConfig": { "directory": "build/publishContent" diff --git a/packages/legend-extension-assortment/package.json b/packages/legend-extension-assortment/package.json index bc23378656..17d5171a17 100644 --- a/packages/legend-extension-assortment/package.json +++ b/packages/legend-extension-assortment/package.json @@ -49,7 +49,7 @@ "@finos/legend-lego": "workspace:*", "@finos/legend-shared": "workspace:*", "@types/react": "18.3.3", - "mobx": "6.12.5", + "mobx": "6.13.0", "mobx-react-lite": "4.0.7", "react": "18.3.1", "serializr": "3.0.2" @@ -61,9 +61,9 @@ "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "sass": "1.77.6", - "typescript": "5.5.2" + "typescript": "5.5.3" }, "peerDependencies": { "react": "^18.0.0" diff --git a/packages/legend-extension-dsl-data-space-studio/package.json b/packages/legend-extension-dsl-data-space-studio/package.json index a88011c74b..f96c1bd219 100644 --- a/packages/legend-extension-dsl-data-space-studio/package.json +++ b/packages/legend-extension-dsl-data-space-studio/package.json @@ -50,7 +50,7 @@ "@finos/legend-server-depot": "workspace:*", "@finos/legend-server-sdlc": "workspace:*", "@finos/legend-shared": "workspace:*", - "mobx": "6.12.5", + "mobx": "6.13.0", "mobx-react-lite": "4.0.7" }, "devDependencies": { @@ -60,9 +60,9 @@ "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "sass": "1.77.6", - "typescript": "5.5.2" + "typescript": "5.5.3" }, "peerDependencies": { "react": "^18.0.0" diff --git a/packages/legend-extension-dsl-data-space/package.json b/packages/legend-extension-dsl-data-space/package.json index c23b990f73..91f4ab49b9 100644 --- a/packages/legend-extension-dsl-data-space/package.json +++ b/packages/legend-extension-dsl-data-space/package.json @@ -54,7 +54,7 @@ "@finos/legend-shared": "workspace:*", "@finos/legend-storage": "workspace:*", "@types/react": "18.3.3", - "mobx": "6.12.5", + "mobx": "6.13.0", "mobx-react-lite": "4.0.7", "react": "18.3.1", "react-dom": "18.3.1", @@ -67,9 +67,9 @@ "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "sass": "1.77.6", - "typescript": "5.5.2" + "typescript": "5.5.3" }, "peerDependencies": { "react": "^18.0.0" diff --git a/packages/legend-extension-dsl-diagram/package.json b/packages/legend-extension-dsl-diagram/package.json index 976b6bdf21..c6ce65ae52 100644 --- a/packages/legend-extension-dsl-diagram/package.json +++ b/packages/legend-extension-dsl-diagram/package.json @@ -54,7 +54,7 @@ "@finos/legend-shared": "workspace:*", "@finos/legend-storage": "workspace:*", "@types/react": "18.3.3", - "mobx": "6.12.5", + "mobx": "6.13.0", "mobx-react-lite": "4.0.7", "react": "18.3.1", "react-dnd": "16.0.1", @@ -64,15 +64,15 @@ "devDependencies": { "@finos/legend-dev-utils": "workspace:*", "@jest/globals": "29.7.0", - "@testing-library/dom": "10.2.0", + "@testing-library/dom": "10.3.1", "@testing-library/react": "16.0.0", "cross-env": "7.0.3", "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "sass": "1.77.6", - "typescript": "5.5.2" + "typescript": "5.5.3" }, "peerDependencies": { "react": "^18.0.0" diff --git a/packages/legend-extension-dsl-persistence/package.json b/packages/legend-extension-dsl-persistence/package.json index 4ac3e44106..043e3dc9a6 100644 --- a/packages/legend-extension-dsl-persistence/package.json +++ b/packages/legend-extension-dsl-persistence/package.json @@ -52,7 +52,7 @@ "@finos/legend-shared": "workspace:*", "@finos/legend-storage": "workspace:*", "@types/react": "18.3.3", - "mobx": "6.12.5", + "mobx": "6.13.0", "react": "18.3.1", "serializr": "3.0.2" }, @@ -63,9 +63,9 @@ "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "sass": "1.77.6", - "typescript": "5.5.2" + "typescript": "5.5.3" }, "peerDependencies": { "react": "^18.0.0" diff --git a/packages/legend-extension-dsl-service/package.json b/packages/legend-extension-dsl-service/package.json index ae75638a23..574bec17ac 100644 --- a/packages/legend-extension-dsl-service/package.json +++ b/packages/legend-extension-dsl-service/package.json @@ -54,7 +54,7 @@ "@finos/legend-shared": "workspace:*", "@finos/legend-storage": "workspace:*", "@types/react": "18.3.3", - "mobx": "6.12.5", + "mobx": "6.13.0", "mobx-react-lite": "4.0.7", "react": "18.3.1", "react-dom": "18.3.1", @@ -67,9 +67,9 @@ "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "sass": "1.77.6", - "typescript": "5.5.2" + "typescript": "5.5.3" }, "peerDependencies": { "react": "^18.0.0" diff --git a/packages/legend-extension-dsl-text/package.json b/packages/legend-extension-dsl-text/package.json index b13707be73..001cd0ebb8 100644 --- a/packages/legend-extension-dsl-text/package.json +++ b/packages/legend-extension-dsl-text/package.json @@ -52,7 +52,7 @@ "@finos/legend-shared": "workspace:*", "@finos/legend-storage": "workspace:*", "@types/react": "18.3.3", - "mobx": "6.12.5", + "mobx": "6.13.0", "mobx-react-lite": "4.0.7", "react": "18.3.1", "serializr": "3.0.2" @@ -64,9 +64,9 @@ "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "sass": "1.77.6", - "typescript": "5.5.2" + "typescript": "5.5.3" }, "peerDependencies": { "react": "^18.0.0" diff --git a/packages/legend-extension-store-flat-data/package.json b/packages/legend-extension-store-flat-data/package.json index 568c64b30f..55209ff29b 100644 --- a/packages/legend-extension-store-flat-data/package.json +++ b/packages/legend-extension-store-flat-data/package.json @@ -50,7 +50,7 @@ "@finos/legend-shared": "workspace:*", "@finos/legend-storage": "workspace:*", "@types/react": "18.3.3", - "mobx": "6.12.5", + "mobx": "6.13.0", "mobx-react-lite": "4.0.7", "react": "18.3.1", "serializr": "3.0.2" @@ -62,9 +62,9 @@ "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "sass": "1.77.6", - "typescript": "5.5.2" + "typescript": "5.5.3" }, "peerDependencies": { "react": "^18.0.0" diff --git a/packages/legend-extension-store-relational/package.json b/packages/legend-extension-store-relational/package.json index 3cacccc185..3bea6c34cc 100644 --- a/packages/legend-extension-store-relational/package.json +++ b/packages/legend-extension-store-relational/package.json @@ -50,7 +50,7 @@ "@finos/legend-shared": "workspace:*", "@finos/legend-storage": "workspace:*", "@types/react": "18.3.3", - "mobx": "6.12.5", + "mobx": "6.13.0", "mobx-react-lite": "4.0.7", "react": "18.3.1", "serializr": "3.0.2" @@ -62,9 +62,9 @@ "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "sass": "1.77.6", - "typescript": "5.5.2" + "typescript": "5.5.3" }, "peerDependencies": { "react": "^18.0.0" diff --git a/packages/legend-extension-store-service-store/package.json b/packages/legend-extension-store-service-store/package.json index 4fafd6be1d..6647784c28 100644 --- a/packages/legend-extension-store-service-store/package.json +++ b/packages/legend-extension-store-service-store/package.json @@ -50,7 +50,7 @@ "@finos/legend-shared": "workspace:*", "@finos/legend-storage": "workspace:*", "@types/react": "18.3.3", - "mobx": "6.12.5", + "mobx": "6.13.0", "mobx-react-lite": "4.0.7", "react": "18.3.1", "serializr": "3.0.2" @@ -62,9 +62,9 @@ "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "sass": "1.77.6", - "typescript": "5.5.2" + "typescript": "5.5.3" }, "peerDependencies": { "react": "^18.0.0" diff --git a/packages/legend-extension-tracer-zipkin/package.json b/packages/legend-extension-tracer-zipkin/package.json index 90b8266a97..14dcbe1ef1 100644 --- a/packages/legend-extension-tracer-zipkin/package.json +++ b/packages/legend-extension-tracer-zipkin/package.json @@ -54,8 +54,8 @@ "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", - "typescript": "5.5.2" + "rimraf": "5.0.8", + "typescript": "5.5.3" }, "publishConfig": { "directory": "build/publishContent" diff --git a/packages/legend-graph/package.json b/packages/legend-graph/package.json index 33e4022a7d..b4d4a6a38b 100644 --- a/packages/legend-graph/package.json +++ b/packages/legend-graph/package.json @@ -42,7 +42,7 @@ "dependencies": { "@finos/legend-shared": "workspace:*", "@finos/legend-storage": "workspace:*", - "mobx": "6.12.5", + "mobx": "6.13.0", "serializr": "3.0.2" }, "devDependencies": { @@ -53,8 +53,8 @@ "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", - "typescript": "5.5.2" + "rimraf": "5.0.8", + "typescript": "5.5.3" }, "publishConfig": { "directory": "build/publishContent" diff --git a/packages/legend-lego/package.json b/packages/legend-lego/package.json index 4202d2df83..061a0df335 100644 --- a/packages/legend-lego/package.json +++ b/packages/legend-lego/package.json @@ -47,22 +47,22 @@ "test:watch": "jest --watch" }, "dependencies": { - "@ag-grid-community/client-side-row-model": "31.3.2", - "@ag-grid-community/core": "31.3.2", - "@ag-grid-community/csv-export": "31.3.2", - "@ag-grid-community/react": "31.3.2", - "@ag-grid-community/styles": "31.3.2", - "@ag-grid-enterprise/clipboard": "31.3.2", - "@ag-grid-enterprise/column-tool-panel": "31.3.2", - "@ag-grid-enterprise/core": "31.3.2", - "@ag-grid-enterprise/excel-export": "31.3.2", - "@ag-grid-enterprise/filter-tool-panel": "31.3.2", - "@ag-grid-enterprise/menu": "31.3.2", - "@ag-grid-enterprise/range-selection": "31.3.2", - "@ag-grid-enterprise/row-grouping": "31.3.2", - "@ag-grid-enterprise/server-side-row-model": "31.3.2", - "@ag-grid-enterprise/side-bar": "31.3.2", - "@ag-grid-enterprise/status-bar": "31.3.2", + "@ag-grid-community/client-side-row-model": "32.0.0", + "@ag-grid-community/core": "32.0.0", + "@ag-grid-community/csv-export": "32.0.0", + "@ag-grid-community/react": "32.0.0", + "@ag-grid-community/styles": "32.0.0", + "@ag-grid-enterprise/clipboard": "32.0.0", + "@ag-grid-enterprise/column-tool-panel": "32.0.0", + "@ag-grid-enterprise/core": "32.0.0", + "@ag-grid-enterprise/excel-export": "32.0.0", + "@ag-grid-enterprise/filter-tool-panel": "32.0.0", + "@ag-grid-enterprise/menu": "32.0.0", + "@ag-grid-enterprise/range-selection": "32.0.0", + "@ag-grid-enterprise/row-grouping": "32.0.0", + "@ag-grid-enterprise/server-side-row-model": "32.0.0", + "@ag-grid-enterprise/side-bar": "32.0.0", + "@ag-grid-enterprise/status-bar": "32.0.0", "@finos/legend-application": "workspace:*", "@finos/legend-art": "workspace:*", "@finos/legend-graph": "workspace:*", @@ -70,7 +70,7 @@ "@types/css-font-loading-module": "0.0.13", "@types/react": "18.3.3", "@types/react-dom": "18.3.0", - "mobx": "6.12.5", + "mobx": "6.13.0", "mobx-react-lite": "4.0.7", "monaco-editor": "0.50.0", "react": "18.3.1", @@ -84,9 +84,9 @@ "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "sass": "1.77.6", - "typescript": "5.5.2" + "typescript": "5.5.3" }, "peerDependencies": { "react": "^18.0.0" diff --git a/packages/legend-manual-tests/package.json b/packages/legend-manual-tests/package.json index 547dff945b..300bf8ab9a 100644 --- a/packages/legend-manual-tests/package.json +++ b/packages/legend-manual-tests/package.json @@ -31,7 +31,7 @@ "@finos/legend-graph": "workspace:*", "@finos/legend-query-builder": "workspace:*", "@finos/legend-shared": "workspace:*", - "@testing-library/dom": "10.2.0", + "@testing-library/dom": "10.3.1", "@testing-library/react": "16.0.0", "react": "18.3.1", "react-dom": "18.3.1" @@ -43,7 +43,7 @@ "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", - "typescript": "5.5.2" + "rimraf": "5.0.8", + "typescript": "5.5.3" } } diff --git a/packages/legend-query-builder/package.json b/packages/legend-query-builder/package.json index 3be15df8c6..4e95f4516d 100644 --- a/packages/legend-query-builder/package.json +++ b/packages/legend-query-builder/package.json @@ -49,13 +49,13 @@ "@finos/legend-server-depot": "workspace:*", "@finos/legend-shared": "workspace:*", "@finos/legend-storage": "workspace:*", - "@testing-library/dom": "10.2.0", + "@testing-library/dom": "10.3.1", "@testing-library/react": "16.0.0", "@types/react": "18.3.3", "@types/react-dom": "18.3.0", "chart.js": "4.4.3", - "mathjs": "13.0.1", - "mobx": "6.12.5", + "mathjs": "13.0.2", + "mobx": "6.13.0", "mobx-react-lite": "4.0.7", "monaco-editor": "0.50.0", "react": "18.3.1", @@ -72,9 +72,9 @@ "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "sass": "1.77.6", - "typescript": "5.5.2" + "typescript": "5.5.3" }, "peerDependencies": { "react": "^18.0.0" diff --git a/packages/legend-query-builder/src/components/result/tds/QueryBuilderTDSGridResult.tsx b/packages/legend-query-builder/src/components/result/tds/QueryBuilderTDSGridResult.tsx index b6ca788b2c..0da619ec7b 100644 --- a/packages/legend-query-builder/src/components/result/tds/QueryBuilderTDSGridResult.tsx +++ b/packages/legend-query-builder/src/components/result/tds/QueryBuilderTDSGridResult.tsx @@ -427,10 +427,10 @@ export const QueryBuilderTDSGridResult = observer( const weightedColumnId = resultState.wavgAggregationState?.weightedColumnIdPairs.get(column); if (weightedColumnId) { - const weightedColumnSum = param.rowNode.allLeafChildren + const weightedColumnSum = (param.rowNode.allLeafChildren ?? []) .map((node) => node.data[weightedColumnId]) .reduce((a, b) => a + b) as number; - const weightedColumnMultiply = param.rowNode.allLeafChildren + const weightedColumnMultiply = (param.rowNode.allLeafChildren ?? []) .map((node) => node.data[weightedColumnId] * node.data[column]) .reduce((a, b) => a + b); if (weightedColumnSum !== 0) { diff --git a/packages/legend-query-builder/src/components/result/tds/QueryBuilderTDSSimpleGridResult.tsx b/packages/legend-query-builder/src/components/result/tds/QueryBuilderTDSSimpleGridResult.tsx index f5f83313e3..091e4e4421 100644 --- a/packages/legend-query-builder/src/components/result/tds/QueryBuilderTDSSimpleGridResult.tsx +++ b/packages/legend-query-builder/src/components/result/tds/QueryBuilderTDSSimpleGridResult.tsx @@ -33,6 +33,7 @@ import { import { QueryBuilderTDSState } from '../../../stores/fetch-structure/tds/QueryBuilderTDSState.js'; import { DEFAULT_LOCALE } from '../../../graph-manager/QueryBuilderConst.js'; import { + guaranteeNonNullable, isBoolean, isNumber, isString, @@ -54,6 +55,7 @@ const QueryResultCellRenderer = observer( resultState.queryBuilderState.fetchStructureState.implementation; const applicationStore = resultState.queryBuilderState.applicationStore; const cellValue = params.value as QueryBuilderTDSResultCellDataType; + const nodeRowIndex = guaranteeNonNullable(params.node.rowIndex); const darkMode = !applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled; @@ -82,7 +84,7 @@ const QueryResultCellRenderer = observer( const currentCellCoordinates = findCoordinatesFromResultValue( columnName, - params.rowIndex, + nodeRowIndex, ); const cellInFilteredResults = resultState.selectedCells.some( (result) => @@ -143,7 +145,7 @@ const QueryResultCellRenderer = observer( if (event.shiftKey) { const coordinates = findCoordinatesFromResultValue( columnName, - params.rowIndex, + nodeRowIndex, ); const actualValue = findResultValueFromCoordinates([ coordinates.rowIndex, @@ -162,7 +164,7 @@ const QueryResultCellRenderer = observer( resultState.setSelectedCells([]); const coordinates = findCoordinatesFromResultValue( columnName, - params.rowIndex, + nodeRowIndex, ); const actualValue = findResultValueFromCoordinates([ coordinates.rowIndex, @@ -181,7 +183,7 @@ const QueryResultCellRenderer = observer( if (event.button === 2) { const coordinates = findCoordinatesFromResultValue( columnName, - params.rowIndex, + nodeRowIndex, ); const isInSelected = isCoordinatesSelected(coordinates); if (!isInSelected) { @@ -218,7 +220,7 @@ const QueryResultCellRenderer = observer( const firstCorner = results.coordinates; const secondCorner = findCoordinatesFromResultValue( columnName, - params.rowIndex, + nodeRowIndex, ); resultState.setSelectedCells([results]); diff --git a/packages/legend-server-depot/package.json b/packages/legend-server-depot/package.json index 7cf9b26075..4870a32992 100644 --- a/packages/legend-server-depot/package.json +++ b/packages/legend-server-depot/package.json @@ -50,8 +50,8 @@ "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", - "typescript": "5.5.2" + "rimraf": "5.0.8", + "typescript": "5.5.3" }, "publishConfig": { "directory": "build/publishContent" diff --git a/packages/legend-server-sdlc/package.json b/packages/legend-server-sdlc/package.json index 9343250a53..b367d80d40 100644 --- a/packages/legend-server-sdlc/package.json +++ b/packages/legend-server-sdlc/package.json @@ -41,7 +41,7 @@ "dependencies": { "@finos/legend-shared": "workspace:*", "@finos/legend-storage": "workspace:*", - "mobx": "6.12.5", + "mobx": "6.13.0", "serializr": "3.0.2" }, "devDependencies": { @@ -51,8 +51,8 @@ "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", - "typescript": "5.5.2" + "rimraf": "5.0.8", + "typescript": "5.5.3" }, "publishConfig": { "directory": "build/publishContent" diff --git a/packages/legend-server-showcase-deployment/package.json b/packages/legend-server-showcase-deployment/package.json index bd015e4a0c..e9380df560 100644 --- a/packages/legend-server-showcase-deployment/package.json +++ b/packages/legend-server-showcase-deployment/package.json @@ -63,8 +63,8 @@ "jest": "29.7.0", "nodemon": "3.1.4", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", - "typescript": "5.5.2", + "rimraf": "5.0.8", + "typescript": "5.5.3", "webpack": "5.92.1", "webpack-bundle-analyzer": "4.10.2", "webpack-cli": "5.1.4" diff --git a/packages/legend-server-showcase/package.json b/packages/legend-server-showcase/package.json index c9bfe43939..2faa95761f 100644 --- a/packages/legend-server-showcase/package.json +++ b/packages/legend-server-showcase/package.json @@ -40,7 +40,7 @@ "dependencies": { "@finos/legend-shared": "workspace:*", "fastify": "4.28.1", - "mobx": "6.12.5", + "mobx": "6.13.0", "serializr": "3.0.2", "yaml": "2.4.5" }, @@ -51,8 +51,8 @@ "eslint": "8.57.0", "jest": "29.7.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", - "typescript": "5.5.2" + "rimraf": "5.0.8", + "typescript": "5.5.3" }, "publishConfig": { "directory": "build/publishContent" diff --git a/packages/legend-shared/package.json b/packages/legend-shared/package.json index 544bee0ef3..f557dc5fb6 100644 --- a/packages/legend-shared/package.json +++ b/packages/legend-shared/package.json @@ -40,7 +40,7 @@ "test:watch": "jest --watch" }, "dependencies": { - "@braintree/sanitize-url": "7.0.3", + "@braintree/sanitize-url": "7.0.4", "@types/lodash-es": "4.17.12", "@types/object-hash": "3.0.6", "@types/pako": "2.0.3", @@ -54,7 +54,7 @@ "http-status-codes": "2.3.0", "lodash-es": "4.17.21", "lossless-json": "4.0.1", - "mobx": "6.12.5", + "mobx": "6.13.0", "object-hash": "3.0.0", "pako": "2.1.0", "papaparse": "5.4.1", @@ -72,8 +72,8 @@ "jest": "29.7.0", "lodash": "4.17.21", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", - "typescript": "5.5.2" + "rimraf": "5.0.8", + "typescript": "5.5.3" }, "publishConfig": { "directory": "build/publishContent" diff --git a/packages/legend-storage/package.json b/packages/legend-storage/package.json index 2a8bcae8b7..475f14e5af 100644 --- a/packages/legend-storage/package.json +++ b/packages/legend-storage/package.json @@ -47,8 +47,8 @@ "jest": "29.7.0", "lodash": "4.17.21", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", - "typescript": "5.5.2" + "rimraf": "5.0.8", + "typescript": "5.5.3" }, "publishConfig": { "directory": "build/publishContent" diff --git a/packages/legend-vscode-extension-dependencies/package.json b/packages/legend-vscode-extension-dependencies/package.json index 4bb5c3207b..6217322e0e 100644 --- a/packages/legend-vscode-extension-dependencies/package.json +++ b/packages/legend-vscode-extension-dependencies/package.json @@ -54,11 +54,11 @@ "cross-env": "7.0.3", "eslint": "8.57.0", "npm-run-all": "4.1.5", - "rimraf": "5.0.7", + "rimraf": "5.0.8", "rollup": "4.18.0", "rollup-plugin-flow": "1.1.1", "rollup-plugin-import-css": "3.5.0", - "typescript": "5.5.2" + "typescript": "5.5.3" }, "publishConfig": { "directory": "build/publishContent" diff --git a/packages/stylelint-config/package.json b/packages/stylelint-config/package.json index 37d14bec1f..0d8a454e7f 100644 --- a/packages/stylelint-config/package.json +++ b/packages/stylelint-config/package.json @@ -37,7 +37,7 @@ "devDependencies": { "cross-env": "7.0.3", "eslint": "8.57.0", - "rimraf": "5.0.7" + "rimraf": "5.0.8" }, "peerDependencies": { "stylelint": ">16.0.0" diff --git a/scripts/test/jest.config.base.js b/scripts/test/jest.config.base.js index da81ddad07..4954735c4e 100644 --- a/scripts/test/jest.config.base.js +++ b/scripts/test/jest.config.base.js @@ -46,6 +46,10 @@ export const getBaseJestConfig = (isGlobal) => { // ag-grid '@ag-grid-community', '@ag-grid-enterprise', + + // color-parse + 'color-parse', + 'color-name', ], }); diff --git a/yarn.lock b/yarn.lock index 60dc258f17..ac4ee15387 100644 --- a/yarn.lock +++ b/yarn.lock @@ -37,168 +37,169 @@ __metadata: languageName: node linkType: hard -"@ag-grid-community/client-side-row-model@npm:31.3.2": - version: 31.3.2 - resolution: "@ag-grid-community/client-side-row-model@npm:31.3.2" +"@ag-grid-community/client-side-row-model@npm:32.0.0": + version: 32.0.0 + resolution: "@ag-grid-community/client-side-row-model@npm:32.0.0" dependencies: - "@ag-grid-community/core": "npm:31.3.2" + "@ag-grid-community/core": "npm:32.0.0" tslib: "npm:^2.3.0" - checksum: 10/305c8d46604c35f7e8d6ee8fad1db1d14babb4eff40c2c457abd4134f4a43eb81cbdcc1c3343ddabd3af166efaf19750d654195faa01ab9d6906192a0f7422e0 + checksum: 10/19b18b878449e6861e01d76043a0f6657cf4283a26c5e5629657ef301220bca1dcb615116f12b7cda3ec6ab3fe1e51a1a939d92e7fbd7b59a602eb3fb5ecf83d languageName: node linkType: hard -"@ag-grid-community/core@npm:31.3.2": - version: 31.3.2 - resolution: "@ag-grid-community/core@npm:31.3.2" +"@ag-grid-community/core@npm:32.0.0": + version: 32.0.0 + resolution: "@ag-grid-community/core@npm:32.0.0" dependencies: + ag-charts-types: "npm:10.0.0" tslib: "npm:^2.3.0" - checksum: 10/1293814e121c08527ca07f544d9c58e7e35db08f42111363f714f38c56db943273942f00cc42714c462f8091e1c987c8d492232e82c91da731dfb280219d031a + checksum: 10/e3f63c92b8f7846f342fff82620f6a62149c11adf48b7fc1b53e5603925ddb0771c20175b5e17f07cebd810fc2950b82816ade42986da38fa96353746d41cd37 languageName: node linkType: hard -"@ag-grid-community/csv-export@npm:31.3.2": - version: 31.3.2 - resolution: "@ag-grid-community/csv-export@npm:31.3.2" +"@ag-grid-community/csv-export@npm:32.0.0": + version: 32.0.0 + resolution: "@ag-grid-community/csv-export@npm:32.0.0" dependencies: - "@ag-grid-community/core": "npm:31.3.2" + "@ag-grid-community/core": "npm:32.0.0" tslib: "npm:^2.3.0" - checksum: 10/0be969ac7459268a0fdee4b11e3d45a1add97ddddb126dbd0ae00b94f4e599f512de164b0ee0c8de7be6cdc5de53fcc63e98970066fd069fa958c7db3a18daeb + checksum: 10/4bbdb6a5b2aa14296b28ea9464243b69c8e5a00e0d7d41ad07b45fd216d3597a2dc3adaad456eabe9a8afadc3ef383f050904dc140142c509899f09c947f84ac languageName: node linkType: hard -"@ag-grid-community/react@npm:31.3.2": - version: 31.3.2 - resolution: "@ag-grid-community/react@npm:31.3.2" +"@ag-grid-community/react@npm:32.0.0": + version: 32.0.0 + resolution: "@ag-grid-community/react@npm:32.0.0" dependencies: prop-types: "npm:^15.8.1" peerDependencies: - "@ag-grid-community/core": 31.3.2 + "@ag-grid-community/core": 32.0.0 react: ^16.3.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.3.0 || ^17.0.0 || ^18.0.0 - checksum: 10/bdbeedd0e6072dd321beb9f3474b94bbc5bee1b016395f46867231ff7981e8d7a28b7a26c8fb41e050c9e5bc5055d37981ba6ea5dcb2074507d593501cd09ca6 + checksum: 10/abbdf4c82fb477e6de0390d1a61b902461c8ac3a83f3fe8dc16f6866bb4b615c9e5ddf31786fff645c9d5f95f92413d73c14e7504aeef03ab3ee121d3405bf68 languageName: node linkType: hard -"@ag-grid-community/styles@npm:31.3.2": - version: 31.3.2 - resolution: "@ag-grid-community/styles@npm:31.3.2" - checksum: 10/b651750803577419e6bbbc45b64d717d64c500332364f4523f84d9d384351f69a7d8eb83bd8343a4ec1530b0db0f26288e91e69516c6ade6e5f7dcf9a7e3078c +"@ag-grid-community/styles@npm:32.0.0": + version: 32.0.0 + resolution: "@ag-grid-community/styles@npm:32.0.0" + checksum: 10/1d2ea54ea2d9fe0eaac5302d967bba4ff5e46a2172a3779c7eef461b747e01d3c1a47ac9b57df3dce593a68bb889dae8260f48bebae029e553ea29f6a316287b languageName: node linkType: hard -"@ag-grid-enterprise/clipboard@npm:31.3.2": - version: 31.3.2 - resolution: "@ag-grid-enterprise/clipboard@npm:31.3.2" +"@ag-grid-enterprise/clipboard@npm:32.0.0": + version: 32.0.0 + resolution: "@ag-grid-enterprise/clipboard@npm:32.0.0" dependencies: - "@ag-grid-community/core": "npm:31.3.2" - "@ag-grid-community/csv-export": "npm:31.3.2" - "@ag-grid-enterprise/core": "npm:31.3.2" - checksum: 10/c70146b52adbe1eb8770604bccd445d898aea5a6634451d2748de011834e31e13758c17fd4f45b4774ee26af698d0b8a4f74830d94bd1989be48a295c654db32 + "@ag-grid-community/core": "npm:32.0.0" + "@ag-grid-community/csv-export": "npm:32.0.0" + "@ag-grid-enterprise/core": "npm:32.0.0" + checksum: 10/bdf3bfea61e41c7665bb5dd4e4d5ad73b77482f337f49face023490042c63c16a3bf11e1207abe83c447bbdc5bbec112a8df04f0a579f7e952cc5497ca065ad6 languageName: node linkType: hard -"@ag-grid-enterprise/column-tool-panel@npm:31.3.2": - version: 31.3.2 - resolution: "@ag-grid-enterprise/column-tool-panel@npm:31.3.2" +"@ag-grid-enterprise/column-tool-panel@npm:32.0.0": + version: 32.0.0 + resolution: "@ag-grid-enterprise/column-tool-panel@npm:32.0.0" dependencies: - "@ag-grid-community/core": "npm:31.3.2" - "@ag-grid-enterprise/core": "npm:31.3.2" - "@ag-grid-enterprise/row-grouping": "npm:31.3.2" - "@ag-grid-enterprise/side-bar": "npm:31.3.2" - checksum: 10/3c945e2b2451bd3375e578c40bd5043a1e96315c41684a800b3669b15f97c0d39d124ea80ec5c30e153ffad03701d41f6858e8e8bbcc7f184bb97394251282f3 + "@ag-grid-community/core": "npm:32.0.0" + "@ag-grid-enterprise/core": "npm:32.0.0" + "@ag-grid-enterprise/row-grouping": "npm:32.0.0" + "@ag-grid-enterprise/side-bar": "npm:32.0.0" + checksum: 10/3a8affa0d6c8fc1842bc8936af847dd2e6afd1f0aa65c986df56750c357d4cc1a493ce2c5ad0c034c78a8b844552e63021a13f1513c50be0c744cf55b33faf61 languageName: node linkType: hard -"@ag-grid-enterprise/core@npm:31.3.2": - version: 31.3.2 - resolution: "@ag-grid-enterprise/core@npm:31.3.2" +"@ag-grid-enterprise/core@npm:32.0.0": + version: 32.0.0 + resolution: "@ag-grid-enterprise/core@npm:32.0.0" dependencies: - "@ag-grid-community/core": "npm:31.3.2" - checksum: 10/791158b3b05e98ec6557dcae9abfc1a4b16266bea5815f0ce90a90b196623cc8bb22882d7c8f1b1dbfeabb4fccbae2423fd3a020a9164fabd93054cd714bfd14 + "@ag-grid-community/core": "npm:32.0.0" + checksum: 10/f744291ae441ff01a6d2b4fc151498001659fe601afaa61ba6d10c5aca447cd46b575630c3e2245c98286a4d0c883bd34a1b430ca19642b8365b75b77d081cb6 languageName: node linkType: hard -"@ag-grid-enterprise/excel-export@npm:31.3.2": - version: 31.3.2 - resolution: "@ag-grid-enterprise/excel-export@npm:31.3.2" +"@ag-grid-enterprise/excel-export@npm:32.0.0": + version: 32.0.0 + resolution: "@ag-grid-enterprise/excel-export@npm:32.0.0" dependencies: - "@ag-grid-community/core": "npm:31.3.2" - "@ag-grid-community/csv-export": "npm:31.3.2" - "@ag-grid-enterprise/core": "npm:31.3.2" - checksum: 10/1873859d2794ae0e2871ac3f4e2501af506f49e60bfef50def50aa8182ca10d2b4d46d874c6d7022659016ff5250f59741d5d82d4e4edbeb8e85ad774ac2051a + "@ag-grid-community/core": "npm:32.0.0" + "@ag-grid-community/csv-export": "npm:32.0.0" + "@ag-grid-enterprise/core": "npm:32.0.0" + checksum: 10/2ec1858204e98913a9623fbe1202a5564281d6d400f776ce8edd90598f53ca9c3ab20d1c1ebcd07c086d5845b18a1e54dc89c6758ad802ee6ca67e0ff5d31dd1 languageName: node linkType: hard -"@ag-grid-enterprise/filter-tool-panel@npm:31.3.2": - version: 31.3.2 - resolution: "@ag-grid-enterprise/filter-tool-panel@npm:31.3.2" +"@ag-grid-enterprise/filter-tool-panel@npm:32.0.0": + version: 32.0.0 + resolution: "@ag-grid-enterprise/filter-tool-panel@npm:32.0.0" dependencies: - "@ag-grid-community/core": "npm:31.3.2" - "@ag-grid-enterprise/core": "npm:31.3.2" - "@ag-grid-enterprise/side-bar": "npm:31.3.2" - checksum: 10/d620a36fcf14785deb0e6e5e489620ef285e6f9262237860f4476a38de28f6c70a3ba3037fcaea8ff320344ffa0bb2ddabc41aaa39cb757477bffb19b4c4b844 + "@ag-grid-community/core": "npm:32.0.0" + "@ag-grid-enterprise/core": "npm:32.0.0" + "@ag-grid-enterprise/side-bar": "npm:32.0.0" + checksum: 10/1125ed5e54f29ef5097968fc66bc52ae0f24c57ebe0e1b51a6650dc39884be3bcd48b37bb60400a530d4b7298a8eaaf0e6bb66234fcea9cc265992d68f44c6bc languageName: node linkType: hard -"@ag-grid-enterprise/menu@npm:31.3.2": - version: 31.3.2 - resolution: "@ag-grid-enterprise/menu@npm:31.3.2" +"@ag-grid-enterprise/menu@npm:32.0.0": + version: 32.0.0 + resolution: "@ag-grid-enterprise/menu@npm:32.0.0" dependencies: - "@ag-grid-community/core": "npm:31.3.2" - "@ag-grid-enterprise/column-tool-panel": "npm:31.3.2" - "@ag-grid-enterprise/core": "npm:31.3.2" - checksum: 10/cc9a96391fa7517df49c81919c1b412926d63ffb14ad71a67ab5d5edc203d2b11701249936a42dfda49f912908e021bb5496604bd30b469240467f9f93b2cce3 + "@ag-grid-community/core": "npm:32.0.0" + "@ag-grid-enterprise/column-tool-panel": "npm:32.0.0" + "@ag-grid-enterprise/core": "npm:32.0.0" + checksum: 10/8803d7dcc3964da3df83d143967652c1bbc9f96ad7605d648ab9da13f2de2918d6369da874fe5eeed055ec3f81b10c22593927020840ba77447bf2cfacdddf13 languageName: node linkType: hard -"@ag-grid-enterprise/range-selection@npm:31.3.2": - version: 31.3.2 - resolution: "@ag-grid-enterprise/range-selection@npm:31.3.2" +"@ag-grid-enterprise/range-selection@npm:32.0.0": + version: 32.0.0 + resolution: "@ag-grid-enterprise/range-selection@npm:32.0.0" dependencies: - "@ag-grid-community/core": "npm:31.3.2" - "@ag-grid-enterprise/core": "npm:31.3.2" - checksum: 10/a5325fcd6825449f78847fb050b0fe65edf4b0db9604711719f29073ff17d39e92db49c53c8c1666e2315c46a7c9638833350441fb492b1cc7e0971e6f0a3312 + "@ag-grid-community/core": "npm:32.0.0" + "@ag-grid-enterprise/core": "npm:32.0.0" + checksum: 10/b638764c485b4f6cd8b3a6d7bfd574e0d4cf6fc3c8dfa3b20a714fa96083b869f7dc757177ef8ad8a86bec5d25ba62f0004bbb4823c6319fe91d553ccc0388b9 languageName: node linkType: hard -"@ag-grid-enterprise/row-grouping@npm:31.3.2": - version: 31.3.2 - resolution: "@ag-grid-enterprise/row-grouping@npm:31.3.2" +"@ag-grid-enterprise/row-grouping@npm:32.0.0": + version: 32.0.0 + resolution: "@ag-grid-enterprise/row-grouping@npm:32.0.0" dependencies: - "@ag-grid-community/core": "npm:31.3.2" - "@ag-grid-enterprise/core": "npm:31.3.2" - checksum: 10/3d99c54385ebeb9ae0bd527a7ed04d0eb8e126e6ee7a4311aef0d1b661d5b24f4114fc9694ea70ab42a67504ec23bb72741822cb54e235f6bfab767646d4a2e9 + "@ag-grid-community/core": "npm:32.0.0" + "@ag-grid-enterprise/core": "npm:32.0.0" + checksum: 10/d284e5e8dd78de5b16495775b0d5d63cbe71fe4d24ca95f812b00457cf75d74c6eba788398d77a8bb03d199f83d76503eda05addbe86b8e2636d5e73870d738e languageName: node linkType: hard -"@ag-grid-enterprise/server-side-row-model@npm:31.3.2": - version: 31.3.2 - resolution: "@ag-grid-enterprise/server-side-row-model@npm:31.3.2" +"@ag-grid-enterprise/server-side-row-model@npm:32.0.0": + version: 32.0.0 + resolution: "@ag-grid-enterprise/server-side-row-model@npm:32.0.0" dependencies: - "@ag-grid-community/core": "npm:31.3.2" - "@ag-grid-enterprise/core": "npm:31.3.2" - checksum: 10/49d7583041258f3cf6b7f7290f027f35029b9599e6df3e57ad2b46b1e87cc1d0c2cc548944891cb762a2ac77138e6021c219ee96849a3b7205d1cf299fecbd21 + "@ag-grid-community/core": "npm:32.0.0" + "@ag-grid-enterprise/core": "npm:32.0.0" + checksum: 10/c983de0d5fa7b09153f839e7df21c56bf0f90f85029e2a4899b83a6fdbbe372e5c48c838a207520171e13103cef01a49f5a899bcce0c21a09d72c59bd9931dc3 languageName: node linkType: hard -"@ag-grid-enterprise/side-bar@npm:31.3.2": - version: 31.3.2 - resolution: "@ag-grid-enterprise/side-bar@npm:31.3.2" +"@ag-grid-enterprise/side-bar@npm:32.0.0": + version: 32.0.0 + resolution: "@ag-grid-enterprise/side-bar@npm:32.0.0" dependencies: - "@ag-grid-community/core": "npm:31.3.2" - "@ag-grid-enterprise/core": "npm:31.3.2" - checksum: 10/8cce8092aeb17836e4b21a665adc5369ff4762d8177f5b5b8eca387ffce0809962db728b4f5948640a1c6ab22122daf1dbc0e93732ac0b4e9e97d95f8b97e6c8 + "@ag-grid-community/core": "npm:32.0.0" + "@ag-grid-enterprise/core": "npm:32.0.0" + checksum: 10/29c58d1e092ff2f3e8b1ee6e218b5b53d7a76ce5b7d5a4a5ddcf667347ce2cfdee84d7d52f1cc48b8a16556b4c33d767ebd77ee629d49e50f207baa38d5f9b16 languageName: node linkType: hard -"@ag-grid-enterprise/status-bar@npm:31.3.2": - version: 31.3.2 - resolution: "@ag-grid-enterprise/status-bar@npm:31.3.2" +"@ag-grid-enterprise/status-bar@npm:32.0.0": + version: 32.0.0 + resolution: "@ag-grid-enterprise/status-bar@npm:32.0.0" dependencies: - "@ag-grid-community/core": "npm:31.3.2" - "@ag-grid-enterprise/core": "npm:31.3.2" + "@ag-grid-community/core": "npm:32.0.0" + "@ag-grid-enterprise/core": "npm:32.0.0" tslib: "npm:^2.3.0" - checksum: 10/c7129e2383d15a338a5b672654165ca234cc1e38ba930a064892f6635bb27428936ad76e0c5b5d29fb68e411ce2353515665577e7778ef00abeed93fa84b5ad3 + checksum: 10/dfa3af70d6df306b107c01ca30ef1906e15b2dc8e4b663b9ba160f86c7c298b189ee6db300df5ea448f10c91b14121d7f3b7440dc151ede037682a88f90b3c0e languageName: node linkType: hard @@ -1691,10 +1692,10 @@ __metadata: languageName: node linkType: hard -"@braintree/sanitize-url@npm:7.0.3": - version: 7.0.3 - resolution: "@braintree/sanitize-url@npm:7.0.3" - checksum: 10/86c0613d795340f555554511df1a3e64f0b5da7774707a8435a9a0b22cd62e38fb4ab5d3ac1b0862ef13106e2513af074d37c29e3184e1323e8c2fef031f181f +"@braintree/sanitize-url@npm:7.0.4": + version: 7.0.4 + resolution: "@braintree/sanitize-url@npm:7.0.4" + checksum: 10/80ea0080776a0305d697d12042acac287675e88a2abd9d294464f70ec57c1b00242d8d02a110c98ef8ea1731e512d67273ff5532c4bf01a78ab8b046fabb53d9 languageName: node linkType: hard @@ -1705,12 +1706,12 @@ __metadata: languageName: node linkType: hard -"@changesets/apply-release-plan@npm:^7.0.3": - version: 7.0.3 - resolution: "@changesets/apply-release-plan@npm:7.0.3" +"@changesets/apply-release-plan@npm:^7.0.4": + version: 7.0.4 + resolution: "@changesets/apply-release-plan@npm:7.0.4" dependencies: "@babel/runtime": "npm:^7.20.1" - "@changesets/config": "npm:^3.0.1" + "@changesets/config": "npm:^3.0.2" "@changesets/get-version-range-type": "npm:^0.4.0" "@changesets/git": "npm:^3.0.0" "@changesets/should-skip-package": "npm:^0.1.0" @@ -1723,22 +1724,22 @@ __metadata: prettier: "npm:^2.7.1" resolve-from: "npm:^5.0.0" semver: "npm:^7.5.3" - checksum: 10/3e8c7d20371c97e55b25d51b1ade6827d6489b86690b7ba4d766bb95c7088ccf46213fedc21a56e31a89ba9b6da3c6cd1213c6f3c54e758ebe7b3b40c79bd7e8 + checksum: 10/793ea2bbe52994120a74b71428abe8c7c406e41b8e6be764069e26338cf21b860bb9609e5144a68e990d7c9115a95b9f2da1aa3631aab4034a5caf306ced41e8 languageName: node linkType: hard -"@changesets/assemble-release-plan@npm:6.0.2, @changesets/assemble-release-plan@npm:^6.0.2": - version: 6.0.2 - resolution: "@changesets/assemble-release-plan@npm:6.0.2" +"@changesets/assemble-release-plan@npm:6.0.3, @changesets/assemble-release-plan@npm:^6.0.3": + version: 6.0.3 + resolution: "@changesets/assemble-release-plan@npm:6.0.3" dependencies: "@babel/runtime": "npm:^7.20.1" "@changesets/errors": "npm:^0.2.0" - "@changesets/get-dependents-graph": "npm:^2.1.0" + "@changesets/get-dependents-graph": "npm:^2.1.1" "@changesets/should-skip-package": "npm:^0.1.0" "@changesets/types": "npm:^6.0.0" "@manypkg/get-packages": "npm:^1.1.3" semver: "npm:^7.5.3" - checksum: 10/19fe2cb45561ebf6ca389a342268c897a8f5dad4926781ebda90a94951c8237c036afebed94bfc46cc202b559051b472f09197f655722902668f97016277a543 + checksum: 10/dca064e03369ad797227c4640f05e89971f3bf9fe05cc66e3db2c43f10910be307b2a0929f0b655321f58e98611392789ab13a542a4858c97e5ebf84db24fe88 languageName: node linkType: hard @@ -1762,18 +1763,18 @@ __metadata: languageName: node linkType: hard -"@changesets/cli@npm:2.27.6": - version: 2.27.6 - resolution: "@changesets/cli@npm:2.27.6" +"@changesets/cli@npm:2.27.7": + version: 2.27.7 + resolution: "@changesets/cli@npm:2.27.7" dependencies: "@babel/runtime": "npm:^7.20.1" - "@changesets/apply-release-plan": "npm:^7.0.3" - "@changesets/assemble-release-plan": "npm:^6.0.2" + "@changesets/apply-release-plan": "npm:^7.0.4" + "@changesets/assemble-release-plan": "npm:^6.0.3" "@changesets/changelog-git": "npm:^0.2.0" - "@changesets/config": "npm:^3.0.1" + "@changesets/config": "npm:^3.0.2" "@changesets/errors": "npm:^0.2.0" - "@changesets/get-dependents-graph": "npm:^2.1.0" - "@changesets/get-release-plan": "npm:^4.0.2" + "@changesets/get-dependents-graph": "npm:^2.1.1" + "@changesets/get-release-plan": "npm:^4.0.3" "@changesets/git": "npm:^3.0.0" "@changesets/logger": "npm:^0.1.0" "@changesets/pre": "npm:^2.0.0" @@ -1800,22 +1801,22 @@ __metadata: term-size: "npm:^2.1.0" bin: changeset: bin.js - checksum: 10/b2922f999e63f5886ad1c7b162c7d9ca488f2150c354fb58d104c9d6b57a817f1e75e995b2e88373f0a1479bb70cd0d4650bd453d5556209afc6969f9b499343 + checksum: 10/17998972706aad3974dfc425d523a2444462aa126bb330f653eb596d3f162eba6df0355b4f489540e20cbd6302f5794f55b5453dc07efa82c13935cd650b05f3 languageName: node linkType: hard -"@changesets/config@npm:3.0.1, @changesets/config@npm:^3.0.1": - version: 3.0.1 - resolution: "@changesets/config@npm:3.0.1" +"@changesets/config@npm:3.0.2, @changesets/config@npm:^3.0.2": + version: 3.0.2 + resolution: "@changesets/config@npm:3.0.2" dependencies: "@changesets/errors": "npm:^0.2.0" - "@changesets/get-dependents-graph": "npm:^2.1.0" + "@changesets/get-dependents-graph": "npm:^2.1.1" "@changesets/logger": "npm:^0.1.0" "@changesets/types": "npm:^6.0.0" "@manypkg/get-packages": "npm:^1.1.3" fs-extra: "npm:^7.0.1" micromatch: "npm:^4.0.2" - checksum: 10/908cdd32779aae48a4f859e65769c72c15f8e8b66146e79079e06be5d1af074609e51983b44bf53c69ef1fa9a3e33e28aea65516465f399d038ae9df8ef32c10 + checksum: 10/f341b3f13b36540ee79c0bcd0ee19740c0e898b9dcb76daf8fc6906183e4154eaa72a28a254fbbc14d76307c20b36588146433dffa0e9557cc2551228507a27d languageName: node linkType: hard @@ -1828,16 +1829,16 @@ __metadata: languageName: node linkType: hard -"@changesets/get-dependents-graph@npm:^2.1.0": - version: 2.1.0 - resolution: "@changesets/get-dependents-graph@npm:2.1.0" +"@changesets/get-dependents-graph@npm:^2.1.1": + version: 2.1.1 + resolution: "@changesets/get-dependents-graph@npm:2.1.1" dependencies: "@changesets/types": "npm:^6.0.0" "@manypkg/get-packages": "npm:^1.1.3" chalk: "npm:^2.1.0" fs-extra: "npm:^7.0.1" semver: "npm:^7.5.3" - checksum: 10/8f34a8948aa497617cd433217f94a5f647fd342bd7c8d3c41042ccb4e1bd5aa397018ee07b8bf03c3f88531ba6092384b41a748ccbd49658d40189f656a04505 + checksum: 10/abe99b47f640e48fa4cdcb79d11ce8ede21a6a0a0a9ee3cd180a5b7c9775df99f44718f4417ba7d66d9469e58a2929986d1bf1e1009fa6e44d3a174a06559eca languageName: node linkType: hard @@ -1851,18 +1852,18 @@ __metadata: languageName: node linkType: hard -"@changesets/get-release-plan@npm:4.0.2, @changesets/get-release-plan@npm:^4.0.2": - version: 4.0.2 - resolution: "@changesets/get-release-plan@npm:4.0.2" +"@changesets/get-release-plan@npm:4.0.3, @changesets/get-release-plan@npm:^4.0.3": + version: 4.0.3 + resolution: "@changesets/get-release-plan@npm:4.0.3" dependencies: "@babel/runtime": "npm:^7.20.1" - "@changesets/assemble-release-plan": "npm:^6.0.2" - "@changesets/config": "npm:^3.0.1" + "@changesets/assemble-release-plan": "npm:^6.0.3" + "@changesets/config": "npm:^3.0.2" "@changesets/pre": "npm:^2.0.0" "@changesets/read": "npm:^0.6.0" "@changesets/types": "npm:^6.0.0" "@manypkg/get-packages": "npm:^1.1.3" - checksum: 10/5f4d66cf1f68a60854c40b0f565edb48743e2c8be6ca653df906af58e534ec8358fd8f22145d3790aa745f158ceb116a256723efda906eb05f7977ee66e52075 + checksum: 10/b85c3e873b224c771159b62512109d4fd73022cba4148d0d00614d69cc6d11dcbdb07c39d28f5e078f3221dadc0d09b93bb785dad72db9e589139a18e22767e2 languageName: node linkType: hard @@ -1975,28 +1976,28 @@ __metadata: linkType: hard "@csstools/css-parser-algorithms@npm:^2.6.3": - version: 2.7.0 - resolution: "@csstools/css-parser-algorithms@npm:2.7.0" + version: 2.7.1 + resolution: "@csstools/css-parser-algorithms@npm:2.7.1" peerDependencies: - "@csstools/css-tokenizer": ^2.3.2 - checksum: 10/b9c01c0d0b360434debc20e2767bf4fb2a469e479a41bdaf908b0b626ae58a265deda07825a4cb3ddb8aab63c4bfdd6f594ad368fef43471ee2f9aa364f09077 + "@csstools/css-tokenizer": ^2.4.1 + checksum: 10/939b23652c970dc4af8c20776e5da9e592cae4a590025f07ddb3263799076d4b6cf1bf8c4de97b29780bfa169177a31945effe94d2a11e0972138b5ff7d93654 languageName: node linkType: hard "@csstools/css-tokenizer@npm:^2.3.1": - version: 2.3.2 - resolution: "@csstools/css-tokenizer@npm:2.3.2" - checksum: 10/0dee283818a4ed6480ba076dc18c842844d8d3b9e771005710606785e3163c39107a2af1ccffd2847fdec947abdcbd93deec8a924a7f1b317ac2de24e185e2a1 + version: 2.4.1 + resolution: "@csstools/css-tokenizer@npm:2.4.1" + checksum: 10/a368e5c96d3b11e147f95951e336105480acfa457cdbc6fdf97e8873ff92ab9ee6b4b6224ac1b263f08798802f6b29b8977a502d070f9ab695c9b9905b964198 languageName: node linkType: hard "@csstools/media-query-list-parser@npm:^2.1.11": - version: 2.1.12 - resolution: "@csstools/media-query-list-parser@npm:2.1.12" + version: 2.1.13 + resolution: "@csstools/media-query-list-parser@npm:2.1.13" peerDependencies: - "@csstools/css-parser-algorithms": ^2.7.0 - "@csstools/css-tokenizer": ^2.3.2 - checksum: 10/ee22ee6ffd0a8922fc5e1d985b338fb13dead051cdadc9835b94e1183db5aeb33e184f25caeb2f05935fb61dd96e11601c6ef4001fb625195e51c4ec7a82cbb3 + "@csstools/css-parser-algorithms": ^2.7.1 + "@csstools/css-tokenizer": ^2.4.1 + checksum: 10/4a771d94eb01a23279d493cd668c71ae230b660c1e6ebcff1bec6e959eae6987ece7ce01b094b44afbae8695dc98d8617580d488db16de9ec4a7378ed5adf57f languageName: node linkType: hard @@ -2277,8 +2278,8 @@ __metadata: cross-env: "npm:7.0.3" eslint: "npm:8.57.0" react-refresh: "npm:0.14.2" - rimraf: "npm:5.0.7" - typescript: "npm:5.5.2" + rimraf: "npm:5.0.8" + typescript: "npm:5.5.3" peerDependencies: "@babel/core": ^7.0.0 languageName: unknown @@ -2290,8 +2291,8 @@ __metadata: dependencies: "@babel/core": "npm:7.24.7" "@babel/eslint-parser": "npm:7.24.7" - "@typescript-eslint/eslint-plugin": "npm:7.14.1" - "@typescript-eslint/parser": "npm:7.14.1" + "@typescript-eslint/eslint-plugin": "npm:7.15.0" + "@typescript-eslint/parser": "npm:7.15.0" cross-env: "npm:7.0.3" eslint-config-prettier: "npm:9.1.0" eslint-plugin-import: "npm:2.29.1" @@ -2300,7 +2301,7 @@ __metadata: eslint-plugin-react-hooks: "npm:4.6.2" micromatch: "npm:4.0.7" prettier: "npm:3.3.2" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" peerDependencies: eslint: ^8.0.0 prettier: ^3.0.0 @@ -2320,8 +2321,8 @@ __metadata: cross-env: "npm:7.0.3" eslint: "npm:8.57.0" npm-run-all: "npm:4.1.5" - rimraf: "npm:5.0.7" - typescript: "npm:5.5.2" + rimraf: "npm:5.0.8" + typescript: "npm:5.5.3" webpack: "npm:5.92.1" webpack-bundle-analyzer: "npm:4.10.2" webpack-cli: "npm:5.1.4" @@ -2346,17 +2347,17 @@ __metadata: cross-env: "npm:7.0.3" eslint: "npm:8.57.0" jest: "npm:29.7.0" - mobx: "npm:6.12.5" + mobx: "npm:6.13.0" mobx-react-lite: "npm:4.0.7" monaco-editor: "npm:0.50.0" npm-run-all: "npm:4.1.5" react: "npm:18.3.1" react-dnd: "npm:16.0.1" react-dom: "npm:18.3.1" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" sass: "npm:1.77.6" serializr: "npm:3.0.2" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" peerDependencies: react: ^18.0.0 languageName: unknown @@ -2386,9 +2387,9 @@ __metadata: eslint: "npm:8.57.0" npm-run-all: "npm:4.1.5" react: "npm:18.3.1" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" sass: "npm:1.77.6" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" languageName: unknown linkType: soft @@ -2402,8 +2403,8 @@ __metadata: cross-env: "npm:7.0.3" eslint: "npm:8.57.0" npm-run-all: "npm:4.1.5" - rimraf: "npm:5.0.7" - typescript: "npm:5.5.2" + rimraf: "npm:5.0.8" + typescript: "npm:5.5.3" webpack: "npm:5.92.1" webpack-bundle-analyzer: "npm:4.10.2" webpack-cli: "npm:5.1.4" @@ -2426,22 +2427,22 @@ __metadata: "@finos/legend-shared": "workspace:*" "@finos/legend-storage": "workspace:*" "@jest/globals": "npm:29.7.0" - "@testing-library/dom": "npm:10.2.0" + "@testing-library/dom": "npm:10.3.1" "@testing-library/react": "npm:16.0.0" "@types/react": "npm:18.3.3" "@types/react-dom": "npm:18.3.0" cross-env: "npm:7.0.3" eslint: "npm:8.57.0" jest: "npm:29.7.0" - mobx: "npm:6.12.5" + mobx: "npm:6.13.0" mobx-react-lite: "npm:4.0.7" npm-run-all: "npm:4.1.5" react: "npm:18.3.1" react-dom: "npm:18.3.1" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" sass: "npm:1.77.6" serializr: "npm:3.0.2" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" peerDependencies: react: ^18.0.0 languageName: unknown @@ -2460,9 +2461,9 @@ __metadata: cross-env: "npm:7.0.3" eslint: "npm:8.57.0" npm-run-all: "npm:4.1.5" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" tailwindcss: "npm:3.4.4" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" webpack: "npm:5.92.1" webpack-bundle-analyzer: "npm:4.10.2" webpack-cli: "npm:5.1.4" @@ -2474,16 +2475,16 @@ __metadata: version: 0.0.0-use.local resolution: "@finos/legend-application-repl@workspace:packages/legend-application-repl" dependencies: - "@ag-grid-community/client-side-row-model": "npm:31.3.2" - "@ag-grid-community/core": "npm:31.3.2" - "@ag-grid-community/react": "npm:31.3.2" - "@ag-grid-community/styles": "npm:31.3.2" - "@ag-grid-enterprise/clipboard": "npm:31.3.2" - "@ag-grid-enterprise/core": "npm:31.3.2" - "@ag-grid-enterprise/menu": "npm:31.3.2" - "@ag-grid-enterprise/range-selection": "npm:31.3.2" - "@ag-grid-enterprise/row-grouping": "npm:31.3.2" - "@ag-grid-enterprise/server-side-row-model": "npm:31.3.2" + "@ag-grid-community/client-side-row-model": "npm:32.0.0" + "@ag-grid-community/core": "npm:32.0.0" + "@ag-grid-community/react": "npm:32.0.0" + "@ag-grid-community/styles": "npm:32.0.0" + "@ag-grid-enterprise/clipboard": "npm:32.0.0" + "@ag-grid-enterprise/core": "npm:32.0.0" + "@ag-grid-enterprise/menu": "npm:32.0.0" + "@ag-grid-enterprise/range-selection": "npm:32.0.0" + "@ag-grid-enterprise/row-grouping": "npm:32.0.0" + "@ag-grid-enterprise/server-side-row-model": "npm:32.0.0" "@finos/legend-application": "workspace:*" "@finos/legend-art": "workspace:*" "@finos/legend-dev-utils": "workspace:*" @@ -2497,17 +2498,17 @@ __metadata: cross-env: "npm:7.0.3" eslint: "npm:8.57.0" jest: "npm:29.7.0" - mobx: "npm:6.12.5" + mobx: "npm:6.13.0" mobx-react-lite: "npm:4.0.7" monaco-editor: "npm:0.50.0" npm-run-all: "npm:4.1.5" react: "npm:18.3.1" react-dnd: "npm:16.0.1" react-dom: "npm:18.3.1" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" sass: "npm:1.77.6" serializr: "npm:3.0.2" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" peerDependencies: react: ^18.0.0 languageName: unknown @@ -2538,9 +2539,9 @@ __metadata: eslint: "npm:8.57.0" npm-run-all: "npm:4.1.5" react: "npm:18.3.1" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" sass: "npm:1.77.6" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" languageName: unknown linkType: soft @@ -2554,8 +2555,8 @@ __metadata: cross-env: "npm:7.0.3" eslint: "npm:8.57.0" npm-run-all: "npm:4.1.5" - rimraf: "npm:5.0.7" - typescript: "npm:5.5.2" + rimraf: "npm:5.0.8" + typescript: "npm:5.5.3" webpack: "npm:5.92.1" webpack-bundle-analyzer: "npm:4.10.2" webpack-cli: "npm:5.1.4" @@ -2579,7 +2580,7 @@ __metadata: "@finos/legend-shared": "workspace:*" "@finos/legend-storage": "workspace:*" "@jest/globals": "npm:29.7.0" - "@testing-library/dom": "npm:10.2.0" + "@testing-library/dom": "npm:10.3.1" "@testing-library/react": "npm:16.0.0" "@types/react": "npm:18.3.3" "@types/react-dom": "npm:18.3.0" @@ -2587,7 +2588,7 @@ __metadata: eslint: "npm:8.57.0" fast-xml-parser: "npm:4.4.0" jest: "npm:29.7.0" - mobx: "npm:6.12.5" + mobx: "npm:6.13.0" mobx-react-lite: "npm:4.0.7" mobx-utils: "npm:6.0.8" monaco-editor: "npm:0.50.0" @@ -2596,10 +2597,10 @@ __metadata: react: "npm:18.3.1" react-dnd: "npm:16.0.1" react-dom: "npm:18.3.1" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" sass: "npm:1.77.6" serializr: "npm:3.0.2" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" yaml: "npm:2.4.5" peerDependencies: react: ^18.0.0 @@ -2621,7 +2622,7 @@ __metadata: eslint: "npm:8.57.0" history: "npm:5.3.0" jest: "npm:29.7.0" - mobx: "npm:6.12.5" + mobx: "npm:6.13.0" mobx-react-lite: "npm:4.0.7" npm-run-all: "npm:4.1.5" react: "npm:18.3.1" @@ -2630,10 +2631,10 @@ __metadata: react-dom: "npm:18.3.1" react-router: "npm:5.3.4" react-router-dom: "npm:5.3.4" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" sass: "npm:1.77.6" serializr: "npm:3.0.2" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" xterm: "npm:5.3.0" xterm-addon-fit: "npm:0.8.0" xterm-addon-search: "npm:0.13.0" @@ -2661,9 +2662,9 @@ __metadata: "@fontsource/roboto-serif": "npm:5.0.13" "@fontsource/ubuntu-mono": "npm:5.0.20" "@jest/globals": "npm:29.7.0" - "@mui/material": "npm:5.15.21" + "@mui/material": "npm:5.16.0" "@types/react": "npm:18.3.3" - "@types/react-resizable": "npm:3.0.7" + "@types/react-resizable": "npm:3.0.8" "@types/react-select": "npm:4.0.18" "@types/react-window": "npm:1.8.8" clsx: "npm:2.1.1" @@ -2672,7 +2673,7 @@ __metadata: eslint: "npm:8.57.0" jest: "npm:29.7.0" mermaid: "npm:10.9.1" - mobx: "npm:6.12.5" + mobx: "npm:6.13.0" mobx-react-lite: "npm:4.0.7" npm-run-all: "npm:4.1.5" react: "npm:18.3.1" @@ -2690,10 +2691,10 @@ __metadata: react-select: "npm:4.3.1" react-window: "npm:1.8.10" remark-gfm: "npm:4.0.0" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" sass: "npm:1.77.6" tailwind-merge: "npm:2.3.0" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" peerDependencies: react: ^18.0.0 languageName: unknown @@ -2704,10 +2705,10 @@ __metadata: resolution: "@finos/legend-dev-utils@workspace:packages/legend-dev-utils" dependencies: "@babel/core": "npm:7.24.7" - "@changesets/assemble-release-plan": "npm:6.0.2" + "@changesets/assemble-release-plan": "npm:6.0.3" "@changesets/changelog-github": "npm:0.5.0" - "@changesets/config": "npm:3.0.1" - "@changesets/get-release-plan": "npm:4.0.2" + "@changesets/config": "npm:3.0.2" + "@changesets/get-release-plan": "npm:4.0.3" "@changesets/git": "npm:3.0.0" "@changesets/logger": "npm:0.1.0" "@changesets/read": "npm:0.6.0" @@ -2724,7 +2725,7 @@ __metadata: clean-webpack-plugin: "npm:4.0.0" cross-env: "npm:7.0.3" css-loader: "npm:7.1.2" - cssnano: "npm:7.0.3" + cssnano: "npm:7.0.4" eslint: "npm:8.57.0" html-webpack-plugin: "npm:5.6.0" isbinaryfile: "npm:5.0.2" @@ -2742,10 +2743,10 @@ __metadata: postcss-loader: "npm:8.1.1" react-refresh: "npm:0.14.2" resolve: "npm:1.22.8" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" sass: "npm:1.77.6" sass-loader: "npm:14.2.1" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" webpack: "npm:5.92.1" languageName: unknown linkType: soft @@ -2766,14 +2767,14 @@ __metadata: cross-env: "npm:7.0.3" eslint: "npm:8.57.0" jest: "npm:29.7.0" - mobx: "npm:6.12.5" + mobx: "npm:6.13.0" mobx-react-lite: "npm:4.0.7" npm-run-all: "npm:4.1.5" react: "npm:18.3.1" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" sass: "npm:1.77.6" serializr: "npm:3.0.2" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" peerDependencies: react: ^18.0.0 languageName: unknown @@ -2831,12 +2832,12 @@ __metadata: cross-env: "npm:7.0.3" eslint: "npm:8.57.0" jest: "npm:29.7.0" - mobx: "npm:6.12.5" + mobx: "npm:6.13.0" mobx-react-lite: "npm:4.0.7" npm-run-all: "npm:4.1.5" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" sass: "npm:1.77.6" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" peerDependencies: react: ^18.0.0 languageName: unknown @@ -2862,15 +2863,15 @@ __metadata: cross-env: "npm:7.0.3" eslint: "npm:8.57.0" jest: "npm:29.7.0" - mobx: "npm:6.12.5" + mobx: "npm:6.13.0" mobx-react-lite: "npm:4.0.7" npm-run-all: "npm:4.1.5" react: "npm:18.3.1" react-dom: "npm:18.3.1" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" sass: "npm:1.77.6" serializr: "npm:3.0.2" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" peerDependencies: react: ^18.0.0 languageName: unknown @@ -2889,22 +2890,22 @@ __metadata: "@finos/legend-shared": "workspace:*" "@finos/legend-storage": "workspace:*" "@jest/globals": "npm:29.7.0" - "@testing-library/dom": "npm:10.2.0" + "@testing-library/dom": "npm:10.3.1" "@testing-library/react": "npm:16.0.0" "@types/react": "npm:18.3.3" cross-env: "npm:7.0.3" eslint: "npm:8.57.0" jest: "npm:29.7.0" - mobx: "npm:6.12.5" + mobx: "npm:6.13.0" mobx-react-lite: "npm:4.0.7" npm-run-all: "npm:4.1.5" react: "npm:18.3.1" react-dnd: "npm:16.0.1" react-dom: "npm:18.3.1" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" sass: "npm:1.77.6" serializr: "npm:3.0.2" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" peerDependencies: react: ^18.0.0 languageName: unknown @@ -2927,13 +2928,13 @@ __metadata: cross-env: "npm:7.0.3" eslint: "npm:8.57.0" jest: "npm:29.7.0" - mobx: "npm:6.12.5" + mobx: "npm:6.13.0" npm-run-all: "npm:4.1.5" react: "npm:18.3.1" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" sass: "npm:1.77.6" serializr: "npm:3.0.2" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" peerDependencies: react: ^18.0.0 languageName: unknown @@ -2960,15 +2961,15 @@ __metadata: cross-env: "npm:7.0.3" eslint: "npm:8.57.0" jest: "npm:29.7.0" - mobx: "npm:6.12.5" + mobx: "npm:6.13.0" mobx-react-lite: "npm:4.0.7" npm-run-all: "npm:4.1.5" react: "npm:18.3.1" react-dom: "npm:18.3.1" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" sass: "npm:1.77.6" serializr: "npm:3.0.2" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" peerDependencies: react: ^18.0.0 languageName: unknown @@ -2991,14 +2992,14 @@ __metadata: cross-env: "npm:7.0.3" eslint: "npm:8.57.0" jest: "npm:29.7.0" - mobx: "npm:6.12.5" + mobx: "npm:6.13.0" mobx-react-lite: "npm:4.0.7" npm-run-all: "npm:4.1.5" react: "npm:18.3.1" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" sass: "npm:1.77.6" serializr: "npm:3.0.2" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" peerDependencies: react: ^18.0.0 languageName: unknown @@ -3020,14 +3021,14 @@ __metadata: cross-env: "npm:7.0.3" eslint: "npm:8.57.0" jest: "npm:29.7.0" - mobx: "npm:6.12.5" + mobx: "npm:6.13.0" mobx-react-lite: "npm:4.0.7" npm-run-all: "npm:4.1.5" react: "npm:18.3.1" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" sass: "npm:1.77.6" serializr: "npm:3.0.2" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" peerDependencies: react: ^18.0.0 languageName: unknown @@ -3049,14 +3050,14 @@ __metadata: cross-env: "npm:7.0.3" eslint: "npm:8.57.0" jest: "npm:29.7.0" - mobx: "npm:6.12.5" + mobx: "npm:6.13.0" mobx-react-lite: "npm:4.0.7" npm-run-all: "npm:4.1.5" react: "npm:18.3.1" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" sass: "npm:1.77.6" serializr: "npm:3.0.2" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" peerDependencies: react: ^18.0.0 languageName: unknown @@ -3079,14 +3080,14 @@ __metadata: cross-env: "npm:7.0.3" eslint: "npm:8.57.0" jest: "npm:29.7.0" - mobx: "npm:6.12.5" + mobx: "npm:6.13.0" mobx-react-lite: "npm:4.0.7" npm-run-all: "npm:4.1.5" react: "npm:18.3.1" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" sass: "npm:1.77.6" serializr: "npm:3.0.2" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" peerDependencies: react: ^18.0.0 languageName: unknown @@ -3105,8 +3106,8 @@ __metadata: jest: "npm:29.7.0" npm-run-all: "npm:4.1.5" opentracing: "npm:0.14.7" - rimraf: "npm:5.0.7" - typescript: "npm:5.5.2" + rimraf: "npm:5.0.8" + typescript: "npm:5.5.3" zipkin: "npm:0.22.0" zipkin-javascript-opentracing: "npm:3.0.0" zipkin-transport-http: "npm:0.22.0" @@ -3124,8 +3125,8 @@ __metadata: fastify: "npm:4.28.1" nodemon: "npm:3.1.4" npm-run-all: "npm:4.1.5" - rimraf: "npm:5.0.7" - typescript: "npm:5.5.2" + rimraf: "npm:5.0.8" + typescript: "npm:5.5.3" languageName: unknown linkType: soft @@ -3141,11 +3142,11 @@ __metadata: cross-env: "npm:7.0.3" eslint: "npm:8.57.0" jest: "npm:29.7.0" - mobx: "npm:6.12.5" + mobx: "npm:6.13.0" npm-run-all: "npm:4.1.5" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" serializr: "npm:3.0.2" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" languageName: unknown linkType: soft @@ -3164,22 +3165,22 @@ __metadata: version: 0.0.0-use.local resolution: "@finos/legend-lego@workspace:packages/legend-lego" dependencies: - "@ag-grid-community/client-side-row-model": "npm:31.3.2" - "@ag-grid-community/core": "npm:31.3.2" - "@ag-grid-community/csv-export": "npm:31.3.2" - "@ag-grid-community/react": "npm:31.3.2" - "@ag-grid-community/styles": "npm:31.3.2" - "@ag-grid-enterprise/clipboard": "npm:31.3.2" - "@ag-grid-enterprise/column-tool-panel": "npm:31.3.2" - "@ag-grid-enterprise/core": "npm:31.3.2" - "@ag-grid-enterprise/excel-export": "npm:31.3.2" - "@ag-grid-enterprise/filter-tool-panel": "npm:31.3.2" - "@ag-grid-enterprise/menu": "npm:31.3.2" - "@ag-grid-enterprise/range-selection": "npm:31.3.2" - "@ag-grid-enterprise/row-grouping": "npm:31.3.2" - "@ag-grid-enterprise/server-side-row-model": "npm:31.3.2" - "@ag-grid-enterprise/side-bar": "npm:31.3.2" - "@ag-grid-enterprise/status-bar": "npm:31.3.2" + "@ag-grid-community/client-side-row-model": "npm:32.0.0" + "@ag-grid-community/core": "npm:32.0.0" + "@ag-grid-community/csv-export": "npm:32.0.0" + "@ag-grid-community/react": "npm:32.0.0" + "@ag-grid-community/styles": "npm:32.0.0" + "@ag-grid-enterprise/clipboard": "npm:32.0.0" + "@ag-grid-enterprise/column-tool-panel": "npm:32.0.0" + "@ag-grid-enterprise/core": "npm:32.0.0" + "@ag-grid-enterprise/excel-export": "npm:32.0.0" + "@ag-grid-enterprise/filter-tool-panel": "npm:32.0.0" + "@ag-grid-enterprise/menu": "npm:32.0.0" + "@ag-grid-enterprise/range-selection": "npm:32.0.0" + "@ag-grid-enterprise/row-grouping": "npm:32.0.0" + "@ag-grid-enterprise/server-side-row-model": "npm:32.0.0" + "@ag-grid-enterprise/side-bar": "npm:32.0.0" + "@ag-grid-enterprise/status-bar": "npm:32.0.0" "@finos/legend-application": "workspace:*" "@finos/legend-art": "workspace:*" "@finos/legend-dev-utils": "workspace:*" @@ -3192,16 +3193,16 @@ __metadata: cross-env: "npm:7.0.3" eslint: "npm:8.57.0" jest: "npm:29.7.0" - mobx: "npm:6.12.5" + mobx: "npm:6.13.0" mobx-react-lite: "npm:4.0.7" monaco-editor: "npm:0.50.0" npm-run-all: "npm:4.1.5" react: "npm:18.3.1" react-dnd: "npm:16.0.1" react-dom: "npm:18.3.1" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" sass: "npm:1.77.6" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" peerDependencies: react: ^18.0.0 languageName: unknown @@ -3222,7 +3223,7 @@ __metadata: "@finos/legend-query-builder": "workspace:*" "@finos/legend-shared": "workspace:*" "@jest/globals": "npm:29.7.0" - "@testing-library/dom": "npm:10.2.0" + "@testing-library/dom": "npm:10.3.1" "@testing-library/react": "npm:16.0.0" cross-env: "npm:7.0.3" eslint: "npm:8.57.0" @@ -3230,8 +3231,8 @@ __metadata: npm-run-all: "npm:4.1.5" react: "npm:18.3.1" react-dom: "npm:18.3.1" - rimraf: "npm:5.0.7" - typescript: "npm:5.5.2" + rimraf: "npm:5.0.8" + typescript: "npm:5.5.3" languageName: unknown linkType: soft @@ -3248,7 +3249,7 @@ __metadata: "@finos/legend-shared": "workspace:*" "@finos/legend-storage": "workspace:*" "@jest/globals": "npm:29.7.0" - "@testing-library/dom": "npm:10.2.0" + "@testing-library/dom": "npm:10.3.1" "@testing-library/react": "npm:16.0.0" "@types/react": "npm:18.3.3" "@types/react-dom": "npm:18.3.0" @@ -3256,8 +3257,8 @@ __metadata: cross-env: "npm:7.0.3" eslint: "npm:8.57.0" jest: "npm:29.7.0" - mathjs: "npm:13.0.1" - mobx: "npm:6.12.5" + mathjs: "npm:13.0.2" + mobx: "npm:6.13.0" mobx-react-lite: "npm:4.0.7" monaco-editor: "npm:0.50.0" npm-run-all: "npm:4.1.5" @@ -3265,11 +3266,11 @@ __metadata: react-chartjs-2: "npm:5.2.0" react-dnd: "npm:16.0.1" react-dom: "npm:18.3.1" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" sass: "npm:1.77.6" serializr: "npm:3.0.2" sql-formatter: "npm:15.3.2" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" peerDependencies: react: ^18.0.0 languageName: unknown @@ -3287,9 +3288,9 @@ __metadata: eslint: "npm:8.57.0" jest: "npm:29.7.0" npm-run-all: "npm:4.1.5" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" serializr: "npm:3.0.2" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" languageName: unknown linkType: soft @@ -3304,11 +3305,11 @@ __metadata: cross-env: "npm:7.0.3" eslint: "npm:8.57.0" jest: "npm:29.7.0" - mobx: "npm:6.12.5" + mobx: "npm:6.13.0" npm-run-all: "npm:4.1.5" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" serializr: "npm:3.0.2" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" languageName: unknown linkType: soft @@ -3327,8 +3328,8 @@ __metadata: jest: "npm:29.7.0" nodemon: "npm:3.1.4" npm-run-all: "npm:4.1.5" - rimraf: "npm:5.0.7" - typescript: "npm:5.5.2" + rimraf: "npm:5.0.8" + typescript: "npm:5.5.3" webpack: "npm:5.92.1" webpack-bundle-analyzer: "npm:4.10.2" webpack-cli: "npm:5.1.4" @@ -3346,11 +3347,11 @@ __metadata: eslint: "npm:8.57.0" fastify: "npm:4.28.1" jest: "npm:29.7.0" - mobx: "npm:6.12.5" + mobx: "npm:6.13.0" npm-run-all: "npm:4.1.5" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" serializr: "npm:3.0.2" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" yaml: "npm:2.4.5" languageName: unknown linkType: soft @@ -3359,7 +3360,7 @@ __metadata: version: 0.0.0-use.local resolution: "@finos/legend-shared@workspace:packages/legend-shared" dependencies: - "@braintree/sanitize-url": "npm:7.0.3" + "@braintree/sanitize-url": "npm:7.0.4" "@finos/legend-dev-utils": "workspace:*" "@jest/globals": "npm:29.7.0" "@types/lodash-es": "npm:4.17.12" @@ -3379,17 +3380,17 @@ __metadata: lodash: "npm:4.17.21" lodash-es: "npm:4.17.21" lossless-json: "npm:4.0.1" - mobx: "npm:6.12.5" + mobx: "npm:6.13.0" npm-run-all: "npm:4.1.5" object-hash: "npm:3.0.0" pako: "npm:2.1.0" papaparse: "npm:5.4.1" pretty-format: "npm:29.7.0" query-string: "npm:9.0.0" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" seedrandom: "npm:3.0.5" serializr: "npm:3.0.2" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" uuid: "npm:10.0.0" languageName: unknown linkType: soft @@ -3406,8 +3407,8 @@ __metadata: jest: "npm:29.7.0" lodash: "npm:4.17.21" npm-run-all: "npm:4.1.5" - rimraf: "npm:5.0.7" - typescript: "npm:5.5.2" + rimraf: "npm:5.0.8" + typescript: "npm:5.5.3" languageName: unknown linkType: soft @@ -3430,11 +3431,11 @@ __metadata: cross-env: "npm:7.0.3" eslint: "npm:8.57.0" npm-run-all: "npm:4.1.5" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" rollup: "npm:4.18.0" rollup-plugin-flow: "npm:1.1.1" rollup-plugin-import-css: "npm:3.5.0" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" languageName: unknown linkType: soft @@ -3446,7 +3447,7 @@ __metadata: eslint: "npm:8.57.0" postcss: "npm:8.4.39" postcss-scss: "npm:4.0.9" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" stylelint-config-standard: "npm:36.0.1" stylelint-scss: "npm:6.3.2" peerDependencies: @@ -3990,23 +3991,23 @@ __metadata: languageName: node linkType: hard -"@mui/core-downloads-tracker@npm:^5.15.21": - version: 5.15.21 - resolution: "@mui/core-downloads-tracker@npm:5.15.21" - checksum: 10/c6f8e2350597833a96593f65e5081930a1006b645be6a34750e93e15e111eeca6973562b42688f5d6393a050401b7196d58c2aa2de96a112ac27fb998411742a +"@mui/core-downloads-tracker@npm:^5.16.0": + version: 5.16.0 + resolution: "@mui/core-downloads-tracker@npm:5.16.0" + checksum: 10/cf625680553eb918f033a6dbeb78078e4a81d0939a3db9a97a7daaacd1449c894b05dab53864d03e8831a98cc32af6780c7c9db82829a2a3967c05b1ee33f222 languageName: node linkType: hard -"@mui/material@npm:5.15.21": - version: 5.15.21 - resolution: "@mui/material@npm:5.15.21" +"@mui/material@npm:5.16.0": + version: 5.16.0 + resolution: "@mui/material@npm:5.16.0" dependencies: "@babel/runtime": "npm:^7.23.9" "@mui/base": "npm:5.0.0-beta.40" - "@mui/core-downloads-tracker": "npm:^5.15.21" - "@mui/system": "npm:^5.15.20" + "@mui/core-downloads-tracker": "npm:^5.16.0" + "@mui/system": "npm:^5.16.0" "@mui/types": "npm:^7.2.14" - "@mui/utils": "npm:^5.15.20" + "@mui/utils": "npm:^5.16.0" "@types/react-transition-group": "npm:^4.4.10" clsx: "npm:^2.1.0" csstype: "npm:^3.1.3" @@ -4026,16 +4027,16 @@ __metadata: optional: true "@types/react": optional: true - checksum: 10/3369cb1d0ddd790de2d972dd5a2039eb2cd26e35ff1c515308d0d03929f9ded02d2ba3038551d94258ac5d5dc9a4433ca76ad60f81573346aa0d69075d72f403 + checksum: 10/7c4f33af2ccbf3ff7a44368befe668854b20ffa09a7a7d99d798f04591b7df34b6202ed3eb20b76570622675acfef15ea5a6324e8ef04236199afa8ebf9f43a0 languageName: node linkType: hard -"@mui/private-theming@npm:^5.15.20": - version: 5.15.20 - resolution: "@mui/private-theming@npm:5.15.20" +"@mui/private-theming@npm:^5.16.0": + version: 5.16.0 + resolution: "@mui/private-theming@npm:5.16.0" dependencies: "@babel/runtime": "npm:^7.23.9" - "@mui/utils": "npm:^5.15.20" + "@mui/utils": "npm:^5.16.0" prop-types: "npm:^15.8.1" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 @@ -4043,7 +4044,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/b50792ffae70682b608eb5d62c1f2697e2d06e41e20f1b0f9e6b648939f1e154f884d8b03b08de22b18fd3c59904a17e7fc4e57b410e5897e47802de15aa2507 + checksum: 10/bb3321fff647d980ae14d02d55d6f5650578f3aff4a154630fb8a4bb23305445e7786d06ec762f7ad1383249f2cd364e0ed17f04cc84e74044ef8488476e2842 languageName: node linkType: hard @@ -4068,15 +4069,15 @@ __metadata: languageName: node linkType: hard -"@mui/system@npm:^5.15.20": - version: 5.15.20 - resolution: "@mui/system@npm:5.15.20" +"@mui/system@npm:^5.16.0": + version: 5.16.0 + resolution: "@mui/system@npm:5.16.0" dependencies: "@babel/runtime": "npm:^7.23.9" - "@mui/private-theming": "npm:^5.15.20" + "@mui/private-theming": "npm:^5.16.0" "@mui/styled-engine": "npm:^5.15.14" "@mui/types": "npm:^7.2.14" - "@mui/utils": "npm:^5.15.20" + "@mui/utils": "npm:^5.16.0" clsx: "npm:^2.1.0" csstype: "npm:^3.1.3" prop-types: "npm:^15.8.1" @@ -4092,7 +4093,7 @@ __metadata: optional: true "@types/react": optional: true - checksum: 10/2bc5d8537b9a01aff406f6b4b113242be7cc88b768b3be0f89668c918492405e5d538131ecf06e0bb1c76aaa99b73231b1a6b64ee218c63cb9f791665c7e9a1a + checksum: 10/dc047d1b54bd33acc4827ce86dcee18d4ee255e9a3843eeb524eeedcf0543171051d7b24e4a2a7b35067c1b05e72be7dfe501d1e299c88988cb503240ac495ed languageName: node linkType: hard @@ -4108,9 +4109,9 @@ __metadata: languageName: node linkType: hard -"@mui/utils@npm:^5.15.14, @mui/utils@npm:^5.15.20": - version: 5.15.20 - resolution: "@mui/utils@npm:5.15.20" +"@mui/utils@npm:^5.15.14, @mui/utils@npm:^5.16.0": + version: 5.16.0 + resolution: "@mui/utils@npm:5.16.0" dependencies: "@babel/runtime": "npm:^7.23.9" "@types/prop-types": "npm:^15.7.11" @@ -4122,7 +4123,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/55842c79e05d4afb24e802925bf7370fac5405be058396ec101a9d66ef4b362263131ce8a7f01b319f7054f90e458a817515058c12ad0f2101fff8778abd4e33 + checksum: 10/c3ef877285ac726c0c704315996f553a785406fb65476c88f5243aed9104e04cc5c6d0eb3a0d42abd54c51cadd634833115fdadc02b51c3396c80848eb943bf1 languageName: node linkType: hard @@ -4605,10 +4606,12 @@ __metadata: languageName: node linkType: hard -"@shikijs/core@npm:1.10.0": - version: 1.10.0 - resolution: "@shikijs/core@npm:1.10.0" - checksum: 10/301436c7c4cb048b8683af74eb306fe728112e231b17e56f3c7b28f82ac664c3b56f620e54bdfc9cfd99cbab486ec29ce98e1123d22bdc43a896c4f73b9aa7d8 +"@shikijs/core@npm:1.10.2": + version: 1.10.2 + resolution: "@shikijs/core@npm:1.10.2" + dependencies: + "@types/hast": "npm:^3.0.4" + checksum: 10/e5d7a975771b21e5823b971fef69e4f1f8e7c1e9d7329567f2226246e8c3238839cdf5aa31fc4cbf332bb7ab5c84f8fa3b01b1fa68c76fda2db92c3a578b124b languageName: node linkType: hard @@ -4644,9 +4647,9 @@ __metadata: languageName: node linkType: hard -"@testing-library/dom@npm:10.2.0": - version: 10.2.0 - resolution: "@testing-library/dom@npm:10.2.0" +"@testing-library/dom@npm:10.3.1": + version: 10.3.1 + resolution: "@testing-library/dom@npm:10.3.1" dependencies: "@babel/code-frame": "npm:^7.10.4" "@babel/runtime": "npm:^7.12.5" @@ -4656,7 +4659,7 @@ __metadata: dom-accessibility-api: "npm:^0.5.9" lz-string: "npm:^1.5.0" pretty-format: "npm:^27.0.2" - checksum: 10/15635e1497de08152de5336860a2cdaee05d3eb4574e283dcf0ac5326eede83fc13f4ac5b01c11df5ca4653ad1017d26a75dd832a2a76ad261c342d40d741f2c + checksum: 10/a78646e775d31b33669274e8baa9c27e6e9ea944131dcdf8d2ac2df7199516d5a9fe483e5ec49c85580399fc2f9efad395876e984b9a4ae520903dec47c773c0 languageName: node linkType: hard @@ -4898,7 +4901,7 @@ __metadata: languageName: node linkType: hard -"@types/hast@npm:^3.0.0": +"@types/hast@npm:^3.0.0, @types/hast@npm:^3.0.4": version: 3.0.4 resolution: "@types/hast@npm:3.0.4" dependencies: @@ -5051,12 +5054,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:20.14.9": - version: 20.14.9 - resolution: "@types/node@npm:20.14.9" +"@types/node@npm:*, @types/node@npm:20.14.10": + version: 20.14.10 + resolution: "@types/node@npm:20.14.10" dependencies: undici-types: "npm:~5.26.4" - checksum: 10/f313b06c79be92f5d3541159ef813b9fc606941f951ecf826e940658c6d4952755ca2f06277b746326cef0697ed79a04676ecde053d32e1121b3352c8168d2e9 + checksum: 10/672892cf94d0d95cf052f11271990686a0fd204cd1e5fe7a4ef240e5315e06711765dc47b9ec98627d3adac18b8c92bb7e2d8db21d18faa20bc3e3203a143e79 languageName: node linkType: hard @@ -5127,12 +5130,12 @@ __metadata: languageName: node linkType: hard -"@types/react-resizable@npm:3.0.7": - version: 3.0.7 - resolution: "@types/react-resizable@npm:3.0.7" +"@types/react-resizable@npm:3.0.8": + version: 3.0.8 + resolution: "@types/react-resizable@npm:3.0.8" dependencies: "@types/react": "npm:*" - checksum: 10/e66dfabcb614f1da1f561d0ecaf1dc384fc0e361d97fa7b219f04f8b85ad9dd2576437117af52ae6bf33644061db2d9452e0a4aadfe457588d93a36d2db8de0b + checksum: 10/aabdef8056bbab3065559bce7ce93232e645fb4f915fd55f0903a2f4df5d2395762dfd75bb0242d5a73d39461e8c062d81eaab87b91213dddfd973ff908f79e4 languageName: node linkType: hard @@ -5331,15 +5334,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:7.14.1": - version: 7.14.1 - resolution: "@typescript-eslint/eslint-plugin@npm:7.14.1" +"@typescript-eslint/eslint-plugin@npm:7.15.0": + version: 7.15.0 + resolution: "@typescript-eslint/eslint-plugin@npm:7.15.0" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:7.14.1" - "@typescript-eslint/type-utils": "npm:7.14.1" - "@typescript-eslint/utils": "npm:7.14.1" - "@typescript-eslint/visitor-keys": "npm:7.14.1" + "@typescript-eslint/scope-manager": "npm:7.15.0" + "@typescript-eslint/type-utils": "npm:7.15.0" + "@typescript-eslint/utils": "npm:7.15.0" + "@typescript-eslint/visitor-keys": "npm:7.15.0" graphemer: "npm:^1.4.0" ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" @@ -5350,44 +5353,44 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10/48c815dbb92399965483c93b27816fad576c3b3227b59eebfe5525e24d07b39ec8b0c7459de83865c8d61c818696519f50b229714dd3ed705d5b35973bfcc781 + checksum: 10/e6b21687ab9e9dc38eb1b1d90a3ac483f3f5e5e9c49aa8a434a24de016822d65c82b926cda2ae79bac2225bd9495fb04f7aa6afcaad2b09f6129fd8014fbcedd languageName: node linkType: hard -"@typescript-eslint/parser@npm:7.14.1": - version: 7.14.1 - resolution: "@typescript-eslint/parser@npm:7.14.1" +"@typescript-eslint/parser@npm:7.15.0": + version: 7.15.0 + resolution: "@typescript-eslint/parser@npm:7.15.0" dependencies: - "@typescript-eslint/scope-manager": "npm:7.14.1" - "@typescript-eslint/types": "npm:7.14.1" - "@typescript-eslint/typescript-estree": "npm:7.14.1" - "@typescript-eslint/visitor-keys": "npm:7.14.1" + "@typescript-eslint/scope-manager": "npm:7.15.0" + "@typescript-eslint/types": "npm:7.15.0" + "@typescript-eslint/typescript-estree": "npm:7.15.0" + "@typescript-eslint/visitor-keys": "npm:7.15.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.56.0 peerDependenciesMeta: typescript: optional: true - checksum: 10/f521462a7005cab5e4923937dcf36713d9438ded175b53332ae469d91cc9eb18cb3a23768b3c52063464280baae83f6b66db28cebb2e262d6d869d1a898b23f3 + checksum: 10/0b5e7a14fa5d0680efb17e750a095729a7fb7c785d7a0fea2f9e6cbfef9e65caab2b751654b348b9ab813d222c1c3f8189ebf48561b81224d1821cee5c99d658 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:7.14.1": - version: 7.14.1 - resolution: "@typescript-eslint/scope-manager@npm:7.14.1" +"@typescript-eslint/scope-manager@npm:7.15.0": + version: 7.15.0 + resolution: "@typescript-eslint/scope-manager@npm:7.15.0" dependencies: - "@typescript-eslint/types": "npm:7.14.1" - "@typescript-eslint/visitor-keys": "npm:7.14.1" - checksum: 10/600a7beb96f5b96f675125285137339c2438b5b26db203a66eef52dd409e8c0db0dafb22c94547dfb963f8efdf63b0fb59e05655e2dcf84d54624863365a59e7 + "@typescript-eslint/types": "npm:7.15.0" + "@typescript-eslint/visitor-keys": "npm:7.15.0" + checksum: 10/45bfdbae2d080691a34f5b37679b4a4067981baa3b82922268abdd21f6917a8dd1c4ccb12133f6c9cce81cfd640040913b223e8125235b92f42fdb57db358a3e languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:7.14.1": - version: 7.14.1 - resolution: "@typescript-eslint/type-utils@npm:7.14.1" +"@typescript-eslint/type-utils@npm:7.15.0": + version: 7.15.0 + resolution: "@typescript-eslint/type-utils@npm:7.15.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:7.14.1" - "@typescript-eslint/utils": "npm:7.14.1" + "@typescript-eslint/typescript-estree": "npm:7.15.0" + "@typescript-eslint/utils": "npm:7.15.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.3.0" peerDependencies: @@ -5395,23 +5398,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10/75c279948a7e7e546d692e85a0b48fc3b648ffee1773feb7ff199aba1b0847a9a16c432b133aa72d26e645627403852b7dd24829f9b3badd6d4711c4cc38e9e4 + checksum: 10/64fa589b413567df3689a19ef88f3dbaed66d965e39cc548a58626eb5bd8fc4e2338496eb632f3472de9ae9800cb14d0e48ef3508efe80bdb91af8f3f1e56ad7 languageName: node linkType: hard -"@typescript-eslint/types@npm:7.14.1": - version: 7.14.1 - resolution: "@typescript-eslint/types@npm:7.14.1" - checksum: 10/608057582bb195bd746a7bfb7c04dac4be1d4602b8fa681b2d1d50b564362b681dc2ca293b13cc4c7acc454f3a09f1ea2580415347efb7853e5df8ba34b7acdb +"@typescript-eslint/types@npm:7.15.0": + version: 7.15.0 + resolution: "@typescript-eslint/types@npm:7.15.0" + checksum: 10/b36c98344469f4bc54a5199733ea4f6d4d0f2da1070605e60d4031e2da2946b84b91a90108516c8e6e83a21030ba4e935053a0906041c920156de40683297d0b languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:7.14.1": - version: 7.14.1 - resolution: "@typescript-eslint/typescript-estree@npm:7.14.1" +"@typescript-eslint/typescript-estree@npm:7.15.0": + version: 7.15.0 + resolution: "@typescript-eslint/typescript-estree@npm:7.15.0" dependencies: - "@typescript-eslint/types": "npm:7.14.1" - "@typescript-eslint/visitor-keys": "npm:7.14.1" + "@typescript-eslint/types": "npm:7.15.0" + "@typescript-eslint/visitor-keys": "npm:7.15.0" debug: "npm:^4.3.4" globby: "npm:^11.1.0" is-glob: "npm:^4.0.3" @@ -5421,31 +5424,31 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10/f75b956f7981712d3f85498f9d9fcc2243d79d6fe71b24bc688a7c43d2a4248f73ecfb78f9d58501fde87fc44b02e26c46f9ea2ae51eb8450db79ca169f91ef9 + checksum: 10/c5fb15108fbbc1bc976e827218ff7bfbc78930c5906292325ee42ba03514623e7b861497b3e3087f71ede9a757b16441286b4d234450450b0dd70ff753782736 languageName: node linkType: hard -"@typescript-eslint/utils@npm:7.14.1": - version: 7.14.1 - resolution: "@typescript-eslint/utils@npm:7.14.1" +"@typescript-eslint/utils@npm:7.15.0": + version: 7.15.0 + resolution: "@typescript-eslint/utils@npm:7.15.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:7.14.1" - "@typescript-eslint/types": "npm:7.14.1" - "@typescript-eslint/typescript-estree": "npm:7.14.1" + "@typescript-eslint/scope-manager": "npm:7.15.0" + "@typescript-eslint/types": "npm:7.15.0" + "@typescript-eslint/typescript-estree": "npm:7.15.0" peerDependencies: eslint: ^8.56.0 - checksum: 10/1ef74214ca84e32f151364512a51e82b7da5590dee03d0de0e1abcf18009e569f9a0638506cf03bd4a844af634b4935458e334b7b2459e9a50a67aba7d6228c7 + checksum: 10/f6de1849dee610a8110638be98ab2ec09e7cdf2f756b538b0544df2dfad86a8e66d5326a765302fe31553e8d9d3170938c0d5d38bd9c7d36e3ee0beb1bdc8172 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:7.14.1": - version: 7.14.1 - resolution: "@typescript-eslint/visitor-keys@npm:7.14.1" +"@typescript-eslint/visitor-keys@npm:7.15.0": + version: 7.15.0 + resolution: "@typescript-eslint/visitor-keys@npm:7.15.0" dependencies: - "@typescript-eslint/types": "npm:7.14.1" + "@typescript-eslint/types": "npm:7.15.0" eslint-visitor-keys: "npm:^3.4.3" - checksum: 10/42246f33cb3f9185c0b467c9a534e34a674e4fc08ba982a03aaa77dc1e569e916f1fca9ce9cd14c4df91f416e6e917bff51f98b8d8ca26ec5f67c253e8646bde + checksum: 10/0e17d7f5de767da7f98170c2efc905cdb0ceeaf04a667e12ca1a92eae64479a07f4f8e2a9b5023b055b01250916c3bcac86908cd06552610baff734fafae4464 languageName: node linkType: hard @@ -5732,11 +5735,18 @@ __metadata: linkType: hard "acorn@npm:^8.0.4, acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.7.1, acorn@npm:^8.8.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": - version: 8.12.0 - resolution: "acorn@npm:8.12.0" + version: 8.12.1 + resolution: "acorn@npm:8.12.1" bin: acorn: bin/acorn - checksum: 10/550cc5033184eb98f7fbe2e9ddadd0f47f065734cc682f25db7a244f52314eb816801b64dec7174effd978045bd1754892731a90b1102b0ede9d17a15cfde138 + checksum: 10/d08c2d122bba32d0861e0aa840b2ee25946c286d5dc5990abca991baf8cdbfbe199b05aacb221b979411a2fea36f83e26b5ac4f6b4e0ce49038c62316c1848f0 + languageName: node + linkType: hard + +"ag-charts-types@npm:10.0.0": + version: 10.0.0 + resolution: "ag-charts-types@npm:10.0.0" + checksum: 10/fc8c3c2e21c9849859f7ab4d11e5c086704f6a8e1846e84b3ed5e5b67344574483635dcfc87b797a6177572e8362a1ea0321f994dd45877e768ec8b29c0e7adf languageName: node linkType: hard @@ -6649,9 +6659,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001599, caniuse-lite@npm:^1.0.30001629": - version: 1.0.30001639 - resolution: "caniuse-lite@npm:1.0.30001639" - checksum: 10/c163080e08982de60b37d51130f088e9f8a745533621675694f0b079f53529308168adb0966051139ff71c75af439b2ce150b7142cff15aac421cbfd126bd481 + version: 1.0.30001640 + resolution: "caniuse-lite@npm:1.0.30001640" + checksum: 10/14f04379452d4302185400db14b286115d25ce96fd09536590233a09908273990deeb1c081a7ea8bc091d86cb4d1665260de8f150e84dc240e17bf7d6af0aca7 languageName: node linkType: hard @@ -7404,16 +7414,16 @@ __metadata: languageName: node linkType: hard -"cssnano-preset-default@npm:^7.0.3": - version: 7.0.3 - resolution: "cssnano-preset-default@npm:7.0.3" +"cssnano-preset-default@npm:^7.0.4": + version: 7.0.4 + resolution: "cssnano-preset-default@npm:7.0.4" dependencies: browserslist: "npm:^4.23.1" css-declaration-sorter: "npm:^7.2.0" cssnano-utils: "npm:^5.0.0" postcss-calc: "npm:^10.0.0" postcss-colormin: "npm:^7.0.1" - postcss-convert-values: "npm:^7.0.1" + postcss-convert-values: "npm:^7.0.2" postcss-discard-comments: "npm:^7.0.1" postcss-discard-duplicates: "npm:^7.0.0" postcss-discard-empty: "npm:^7.0.0" @@ -7440,7 +7450,7 @@ __metadata: postcss-unique-selectors: "npm:^7.0.1" peerDependencies: postcss: ^8.4.31 - checksum: 10/6a80d67aaa8809f733c56a314a6096481d4e8e04ad10dcb84c08f54d925fdf987fdcc9f8d3926ed949cb9d28fc642455df1552ad87b09b234fd10e2517070922 + checksum: 10/4c0cff049187f3171372abd266aac7a9d5ea6e87e8bfc1f4579109de8ae76a995e507c5c398d253f86b9904345280878bdca917d9ba0a30704f9bf1c06fda024 languageName: node linkType: hard @@ -7453,15 +7463,15 @@ __metadata: languageName: node linkType: hard -"cssnano@npm:7.0.3": - version: 7.0.3 - resolution: "cssnano@npm:7.0.3" +"cssnano@npm:7.0.4": + version: 7.0.4 + resolution: "cssnano@npm:7.0.4" dependencies: - cssnano-preset-default: "npm:^7.0.3" + cssnano-preset-default: "npm:^7.0.4" lilconfig: "npm:^3.1.2" peerDependencies: postcss: ^8.4.31 - checksum: 10/44fce4461e371425d18acc36d78b28ccff1bfe8d4745d3dfc8dc1553c440f9fb7724c86677733cc924a3b42985115ffd64849ea93a6e77663c81ac85775f4a12 + checksum: 10/fb7363992806d779d733d10157b6ff680e337eaa53492cd7936104de4c54109bd649c201be91ab1e63d6defc7bc08fb65dcfe7f66b3d73dfc542c0dcfc384cf5 languageName: node linkType: hard @@ -8382,9 +8392,9 @@ __metadata: linkType: hard "dompurify@npm:^3.0.5": - version: 3.1.5 - resolution: "dompurify@npm:3.1.5" - checksum: 10/4ea935df48b49a0a76c66b6eee8522ca12783f2643119482b8329867f1e8adb34ff1d2dd56973927be9de5f01079948556907f22e882b06fa7b0c0ba281bf14a + version: 3.1.6 + resolution: "dompurify@npm:3.1.6" + checksum: 10/036844bc9b717b172ba27f5863b56f950289a05d8eebfb702d6953bbf80bd021e480ce4217bd084567186f2d0ada13358ce5556963492cfe402d774e8667f120 languageName: node linkType: hard @@ -8449,9 +8459,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.4.796": - version: 1.4.815 - resolution: "electron-to-chromium@npm:1.4.815" - checksum: 10/84f59b76b1ac16fe1f359720bdaeadcbce34825a7e79e3551ceec6b52d4021e7bd8a56a2cfa4197ba353331df18d0bc2ab449e08c5599eb1b2a7aacaba56f711 + version: 1.4.818 + resolution: "electron-to-chromium@npm:1.4.818" + checksum: 10/e0846ec8c59021648c4dc34477988cdcae35f0bee5607437411a8f1a8a4bd41da7d3c4184ba431230b924751451a6ff4e820d86a45f26cfce4eeb5eea7e8b5a8 languageName: node linkType: hard @@ -9853,8 +9863,8 @@ __metadata: linkType: hard "glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.7, glob@npm:^10.4.1": - version: 10.4.2 - resolution: "glob@npm:10.4.2" + version: 10.4.3 + resolution: "glob@npm:10.4.3" dependencies: foreground-child: "npm:^3.1.0" jackspeak: "npm:^3.1.2" @@ -9864,7 +9874,7 @@ __metadata: path-scurry: "npm:^1.11.1" bin: glob: dist/esm/bin.mjs - checksum: 10/e412776b5952a818eba790c830bea161c9a56813fd767d8c4c49f855603b1fb962b3e73f1f627a47298a57d2992b9f0f2fe15cf93e74ecaaa63fb45d63fdd090 + checksum: 10/7670e257bc7cf62a5649e79a71fc3b74806516eabfbfef0a949e11c5530c215d0f6d75c8c0c35266ff44ef6cb29b6c0e59be63906909be946d4c65df5d336be8 languageName: node linkType: hard @@ -10568,9 +10578,9 @@ __metadata: languageName: node linkType: hard -"inquirer@npm:9.3.2": - version: 9.3.2 - resolution: "inquirer@npm:9.3.2" +"inquirer@npm:9.3.4": + version: 9.3.4 + resolution: "inquirer@npm:9.3.4" dependencies: "@inquirer/figures": "npm:^1.0.3" ansi-escapes: "npm:^4.3.2" @@ -10583,8 +10593,8 @@ __metadata: string-width: "npm:^4.2.3" strip-ansi: "npm:^6.0.1" wrap-ansi: "npm:^6.2.0" - yoctocolors-cjs: "npm:^2.1.1" - checksum: 10/a19e5fc3c0c802b38d1130a67e5d7062e698994e9f7334d56a36a5bca4539be80f136ebe02e2dbe4caa50620ea64827494b96919425bb1db089e807e17c96d43 + yoctocolors-cjs: "npm:^2.1.2" + checksum: 10/f9d20820ad07bfaa98ad1b0e1bb65da9cb020edafda25f781a28e7fe0fc98eb15b3fe95687258140a24a6bc9d209740d38ab17cc265c12fa6738db530c71b17e languageName: node linkType: hard @@ -11252,15 +11262,15 @@ __metadata: linkType: hard "jackspeak@npm:^3.1.2": - version: 3.4.0 - resolution: "jackspeak@npm:3.4.0" + version: 3.4.1 + resolution: "jackspeak@npm:3.4.1" dependencies: "@isaacs/cliui": "npm:^8.0.2" "@pkgjs/parseargs": "npm:^0.11.0" dependenciesMeta: "@pkgjs/parseargs": optional: true - checksum: 10/5032c43c0c1fb92e72846ce496df559214253bc6870c90399cbd7858571c53169d9494b7c152df04abcb75f2fb5e9cffe65651c67d573380adf3a482b150d84b + checksum: 10/73225d15b5d1eb3b882bec6e88d956c91ba954afe6a23f1f5e95494c04b68e5b3636f3fe304c8a416e1e68bef7e664a9e6c4ae7e77be8f502b5d16a9ecdcfe00 languageName: node linkType: hard @@ -12003,13 +12013,13 @@ __metadata: linkType: hard "katex@npm:^0.16.9": - version: 0.16.10 - resolution: "katex@npm:0.16.10" + version: 0.16.11 + resolution: "katex@npm:0.16.11" dependencies: commander: "npm:^8.3.0" bin: katex: cli.js - checksum: 10/367034012311c695791de4553b3e4c7a9f36d126a0cae17b97f4e8832ced2559961f9fa6d39e0116e1374013e12ac8af159eb014678f06b4acf5e547292ea3e5 + checksum: 10/adfb95a70168f732c26f44a443d27df393ca641a3533aa9321f37b1b69134cf4b15142d533c187ec9a0b02c0bbfebab5ab26f15bd0cc08a57114e1f767f0d7ae languageName: node linkType: hard @@ -12081,32 +12091,32 @@ __metadata: "@actions/core": "npm:1.10.1" "@actions/github": "npm:6.0.0" "@babel/core": "npm:7.24.7" - "@changesets/cli": "npm:2.27.6" + "@changesets/cli": "npm:2.27.7" "@finos/babel-preset-legend-studio": "workspace:*" "@finos/eslint-plugin-legend-studio": "workspace:*" "@finos/legend-dev-utils": "workspace:*" "@finos/stylelint-config-legend-studio": "workspace:*" - "@types/node": "npm:20.14.9" + "@types/node": "npm:20.14.10" chalk: "npm:5.3.0" cross-env: "npm:7.0.3" envinfo: "npm:7.13.0" eslint: "npm:8.57.0" fs-extra: "npm:11.2.0" husky: "npm:9.0.11" - inquirer: "npm:9.3.2" + inquirer: "npm:9.3.4" jest: "npm:29.7.0" lint-staged: "npm:15.2.7" micromatch: "npm:4.0.7" npm-run-all: "npm:4.1.5" prettier: "npm:3.3.2" prettier-plugin-tailwindcss: "npm:0.6.5" - rimraf: "npm:5.0.7" + rimraf: "npm:5.0.8" sass: "npm:1.77.6" semver: "npm:7.6.2" sort-package-json: "npm:2.10.0" stylelint: "npm:16.6.1" typedoc: "npm:0.26.3" - typescript: "npm:5.5.2" + typescript: "npm:5.5.3" yargs: "npm:17.7.2" languageName: unknown linkType: soft @@ -12393,9 +12403,9 @@ __metadata: linkType: hard "lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": - version: 10.3.0 - resolution: "lru-cache@npm:10.3.0" - checksum: 10/37e921aedbd1f4062475d9fa6760391fa7adfaaee3a5a6cbedd1d6d0b46705c14012312c1edb2b13f119eae6584a48f73c158d118828d42475b44a7abf7d05ab + version: 10.3.1 + resolution: "lru-cache@npm:10.3.1" + checksum: 10/52938a77f14f874e88fd9bf0fc8a39873e52deff85a4e3bb86d7c3a38b0ef2dcaddf1f7f59b2a131a66f3bdb56e26c1843eddbf7dddc02acc69279f74e4331c9 languageName: node linkType: hard @@ -12504,9 +12514,9 @@ __metadata: languageName: node linkType: hard -"mathjs@npm:13.0.1": - version: 13.0.1 - resolution: "mathjs@npm:13.0.1" +"mathjs@npm:13.0.2": + version: 13.0.2 + resolution: "mathjs@npm:13.0.2" dependencies: "@babel/runtime": "npm:^7.24.7" complex.js: "npm:^2.1.1" @@ -12519,7 +12529,7 @@ __metadata: typed-function: "npm:^4.2.1" bin: mathjs: bin/cli.js - checksum: 10/abb53cdd1ed9668cedae08e696d02b1836e6c0598d89dfb346435559a42959192a445ebfb60fa5482f9dde528ab601ffe200bd0a01c910cf795a2582ea98082c + checksum: 10/1481dfdd969d09ee3c4f7e16aea409fcdbfa2f14e4ce9d873e7e6d1470c121c271ecaf87a7a0da3f1e6ce883dcaef63a569332199f4b6a5c169a3e67d4396750 languageName: node linkType: hard @@ -12935,20 +12945,20 @@ __metadata: linkType: hard "micromark-extension-gfm-autolink-literal@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-extension-gfm-autolink-literal@npm:2.0.0" + version: 2.1.0 + resolution: "micromark-extension-gfm-autolink-literal@npm:2.1.0" dependencies: micromark-util-character: "npm:^2.0.0" micromark-util-sanitize-uri: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10/77a3a3563ab2ffcf44c774a3f0ddcc1662d664e53ff2f42a528fb53564e9307331b35d01e7942a027198eb2e958cc2825cac96e87d6c4de301f535cfcaea0dc4 + checksum: 10/933b9b96ca62cd50732d9e58ae90ba446f4314e0ecbff3127e9aae430d9a295346f88fb33b5532acaf648d659b0db92e0c00c2e9f504c0d7b8bb4553318cac50 languageName: node linkType: hard "micromark-extension-gfm-footnote@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-extension-gfm-footnote@npm:2.0.0" + version: 2.1.0 + resolution: "micromark-extension-gfm-footnote@npm:2.1.0" dependencies: devlop: "npm:^1.0.0" micromark-core-commonmark: "npm:^2.0.0" @@ -12958,13 +12968,13 @@ __metadata: micromark-util-sanitize-uri: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10/7813d226b862f84d417ff890f263961c1fdceaf4b02d543bf754e21b46b834bf524962acc9bb058af26edc65c838c194735fd858079c6340a0f217d031e0932d + checksum: 10/7e019414e31ab53c49c909b7068adbbcb1726433fce82bf735219276fe6e00a42b66288acb5c8831f80e77480fac34880eeeb60b1dc09d5885862b31db4b9ea2 languageName: node linkType: hard "micromark-extension-gfm-strikethrough@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-extension-gfm-strikethrough@npm:2.0.0" + version: 2.1.0 + resolution: "micromark-extension-gfm-strikethrough@npm:2.1.0" dependencies: devlop: "npm:^1.0.0" micromark-util-chunked: "npm:^2.0.0" @@ -12972,20 +12982,20 @@ __metadata: micromark-util-resolve-all: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10/a06470195c55c20e6c8f4ecf0208ff3b58e1e4d530b1f377a9eaad857722b891a74aacb6dbc9755716282a1807d6acb6bb1e6e92295b7cef9060ab172d4abbed + checksum: 10/eaf2c7b1e3eb2a7d7f405e8abe561be083cc52b8e027225ed286490939f527d18c120df59c8d8e17fdcf284f8d014502bf3db45d8e36e3109457ece8fb1db29b languageName: node linkType: hard "micromark-extension-gfm-table@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-extension-gfm-table@npm:2.0.0" + version: 2.1.0 + resolution: "micromark-extension-gfm-table@npm:2.1.0" dependencies: devlop: "npm:^1.0.0" micromark-factory-space: "npm:^2.0.0" micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10/3fbdf52ba8c9d0fa2dddab2f6a669e4386ea58ff6b979de16e6d1ff4c055b7b933f138257326ee45b2b14c8319b7cdb264a9bb77330caccae176765c8a488fd0 + checksum: 10/37385c3b6e4833f9d9a277f98062af40ccf8c70e83726ab0c1ef9d6cb5784dd18489d1df62b241e8289349be11f5ab0ab3337043fe004bc9150f1067f9476c9b languageName: node linkType: hard @@ -12999,15 +13009,15 @@ __metadata: linkType: hard "micromark-extension-gfm-task-list-item@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-extension-gfm-task-list-item@npm:2.0.1" + version: 2.1.0 + resolution: "micromark-extension-gfm-task-list-item@npm:2.1.0" dependencies: devlop: "npm:^1.0.0" micromark-factory-space: "npm:^2.0.0" micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10/aa448eeac58e031ff863bcf40475a531c07cff10a127d77cd09ebce76922a329e1908091430102a253fc0fd79345f31273ee6a2b5a71344e4c400f532efb9472 + checksum: 10/c5f72929f0dca77df01442b721356624de6657364e2264ef50fc7226305976f302a49b670836f9494ce70a9b0335d974b5ef8e6457553c4c200bfc06d6951964 languageName: node linkType: hard @@ -13679,10 +13689,10 @@ __metadata: languageName: node linkType: hard -"mobx@npm:6.12.5": - version: 6.12.5 - resolution: "mobx@npm:6.12.5" - checksum: 10/af03258be314120153cb33953aad5cfb6e639e8536f3374d77dfad2244376c228f960b157e4133c97b8b8b6d552c6e369dff05ce43c8e2f2fe17066b0d060cb3 +"mobx@npm:6.13.0": + version: 6.13.0 + resolution: "mobx@npm:6.13.0" + checksum: 10/3e32e1cb9c1a63abddc552754e7e6388362c27ad9d280f1247a6d5b6c704a1bf0a89fadaab0c6a9e2ba764e008fc9023a9f338c423be67e0858c4782a0685538 languageName: node linkType: hard @@ -14735,15 +14745,15 @@ __metadata: languageName: node linkType: hard -"postcss-convert-values@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-convert-values@npm:7.0.1" +"postcss-convert-values@npm:^7.0.2": + version: 7.0.2 + resolution: "postcss-convert-values@npm:7.0.2" dependencies: browserslist: "npm:^4.23.1" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4.31 - checksum: 10/f99c421647dd6433c154f6a31f7fcad9df52320310f1a78e6ccf2b2599b457726185f55b17d452662632f6bbbb499eb61d451c8f4c3f61db7120e424d14800c8 + checksum: 10/15e0a804f42a417a6cabfba8346ed489514240c2d7dffda6dca34644d2c6a5ad76974aeffec36de6a424eb4cb2d72302e0f6bbecc6568390f02c0198f6d0ba7f languageName: node linkType: hard @@ -15194,14 +15204,14 @@ __metadata: linkType: hard "preferred-pm@npm:^3.0.0": - version: 3.1.3 - resolution: "preferred-pm@npm:3.1.3" + version: 3.1.4 + resolution: "preferred-pm@npm:3.1.4" dependencies: find-up: "npm:^5.0.0" find-yarn-workspace-root2: "npm:1.2.16" path-exists: "npm:^4.0.0" - which-pm: "npm:2.0.0" - checksum: 10/3aa768985487c17d08936670b34939c21b5740e35186312d394c09f2c65fb1938fd4e074d0de5d80091c6a154f4adfa566b614fd4971caf43082c2a119e59d6b + which-pm: "npm:^2.2.0" + checksum: 10/bde91a492cc2662a5229cdc7a0fe35584674d4200227cf2db4ea9fc726874d2ec469f83ac27f0fb13cf215a6ac0eeabd5d6ac0f6995ea29af4e63ae5fb71b65c languageName: node linkType: hard @@ -16298,7 +16308,7 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:5.0.7, rimraf@npm:^5.0.5": +"rimraf@npm:5.0.7": version: 5.0.7 resolution: "rimraf@npm:5.0.7" dependencies: @@ -16309,6 +16319,17 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:5.0.8, rimraf@npm:^5.0.5": + version: 5.0.8 + resolution: "rimraf@npm:5.0.8" + dependencies: + glob: "npm:^10.3.7" + bin: + rimraf: dist/esm/bin.mjs + checksum: 10/ab8f1bcb49762d16120813a127f90773da657bb5c6f29d3865c1b3c1ceb0d2291cd3e7b439adb7571024be47dce8443b3ffd1b116ec78b6122fca0571da87a79 + languageName: node + linkType: hard + "rimraf@npm:^2.6.3": version: 2.7.1 resolution: "rimraf@npm:2.7.1" @@ -16851,11 +16872,12 @@ __metadata: linkType: hard "shiki@npm:^1.9.1": - version: 1.10.0 - resolution: "shiki@npm:1.10.0" + version: 1.10.2 + resolution: "shiki@npm:1.10.2" dependencies: - "@shikijs/core": "npm:1.10.0" - checksum: 10/e5c844acece5eef2b796d63040ff9655fbd1070d10c50726eebaddc0506b9bdaee7fc28c7299168ef1a4eb9007db7e928bd03a80d3918c37df0fe3a96363d66b + "@shikijs/core": "npm:1.10.2" + "@types/hast": "npm:^3.0.4" + checksum: 10/bbb41bc396201883a2bc49f04bfdbe47f5aaa0ac3e0c0d5a1b0a572f88628af66e47a3a3f43f38af9f7bbfe8d18411bfdb50481bba74c01b44dcd67d4665c39b languageName: node linkType: hard @@ -18182,13 +18204,13 @@ __metadata: languageName: node linkType: hard -"typescript@npm:5.5.2": - version: 5.5.2 - resolution: "typescript@npm:5.5.2" +"typescript@npm:5.5.3": + version: 5.5.3 + resolution: "typescript@npm:5.5.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/9118b20f248e76b0dbff8737fef65dfa89d02668d4e633d2c5ceac99033a0ca5e8a1c1a53bc94da68e8f67677a88f318663dde859c9e9a09c1e116415daec2ba + checksum: 10/11a867312419ed497929aafd2f1d28b2cd41810a5eb6c6e9e169559112e9ea073d681c121a29102e67cd4478d0a4ae37a306a5800f3717f59c4337e6a9bd5e8d languageName: node linkType: hard @@ -18202,13 +18224,13 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A5.5.2#optional!builtin": - version: 5.5.2 - resolution: "typescript@patch:typescript@npm%3A5.5.2#optional!builtin::version=5.5.2&hash=b45daf" +"typescript@patch:typescript@npm%3A5.5.3#optional!builtin": + version: 5.5.3 + resolution: "typescript@patch:typescript@npm%3A5.5.3#optional!builtin::version=5.5.3&hash=b45daf" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/28b3de2ddaf63a7620e7ddbe5d377af71ce93ecc558c41bf0e3d88661d8e6e7aa6c7739164fef98055f69819e41faca49252938ef3633a3dff2734cca6a9042e + checksum: 10/b61b8bb4b4d6a8a00f9d5f931f8c67070eed6ad11feabf4c41744a326987080bfc806a621596c70fbf2e5974eca3ed65bafeeeb22a078071bdfb51d8abd7c013 languageName: node linkType: hard @@ -18428,8 +18450,8 @@ __metadata: linkType: hard "update-browserslist-db@npm:^1.0.16": - version: 1.0.16 - resolution: "update-browserslist-db@npm:1.0.16" + version: 1.1.0 + resolution: "update-browserslist-db@npm:1.1.0" dependencies: escalade: "npm:^3.1.2" picocolors: "npm:^1.0.1" @@ -18437,7 +18459,7 @@ __metadata: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 10/071bf0b2fb8568db6cd42ee2598ac9b87c794a7229fcbf1b035ae7f883e770c07143f16a5371525d5bcb94b99f9a1b279036142b0195ffd4cf5a0008fc4a500e + checksum: 10/d70b9efeaf4601aadb1a4f6456a7a5d9118e0063d995866b8e0c5e0cf559482671dab6ce7b079f9536b06758a344fbd83f974b965211e1c6e8d1958540b0c24c languageName: node linkType: hard @@ -18935,13 +18957,13 @@ __metadata: languageName: node linkType: hard -"which-pm@npm:2.0.0": - version: 2.0.0 - resolution: "which-pm@npm:2.0.0" +"which-pm@npm:^2.2.0": + version: 2.2.0 + resolution: "which-pm@npm:2.2.0" dependencies: load-yaml-file: "npm:^0.2.0" path-exists: "npm:^4.0.0" - checksum: 10/8f9dc47ab1302d536458a3d28b891907540d67e18b95d8cf0a41ba768b679c2bc7b64c17d9b80c85443c4b300a3e2d5c29ae1e9c7c6ad2833760070fbdbd3b6f + checksum: 10/f6fe0ad163ba5385c7b8f3465cd29492ab1af6e5c2d5eb0c320008ac458c1614241ebe8d7d7d76d79021aa866a66e2454e181ac681f525cf259ec27abab9468c languageName: node linkType: hard @@ -19092,8 +19114,8 @@ __metadata: linkType: hard "ws@npm:^8.11.0, ws@npm:^8.16.0": - version: 8.17.1 - resolution: "ws@npm:8.17.1" + version: 8.18.0 + resolution: "ws@npm:8.18.0" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -19102,7 +19124,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 10/4264ae92c0b3e59c7e309001e93079b26937aab181835fb7af79f906b22cd33b6196d96556dafb4e985742dd401e99139572242e9847661fdbc96556b9e6902d + checksum: 10/70dfe53f23ff4368d46e4c0b1d4ca734db2c4149c6f68bc62cb16fc21f753c47b35fcc6e582f3bdfba0eaeb1c488cddab3c2255755a5c3eecb251431e42b3ff6 languageName: node linkType: hard @@ -19252,10 +19274,10 @@ __metadata: languageName: node linkType: hard -"yoctocolors-cjs@npm:^2.1.1": - version: 2.1.1 - resolution: "yoctocolors-cjs@npm:2.1.1" - checksum: 10/d7cbb833eb2fac85e38f5efeaf163ad2d468b7795eef595f034183a404253767d06ec6075e44ab0414436a7bbf5e4aad524e5a3f380dafbbd24e971a4ee51d37 +"yoctocolors-cjs@npm:^2.1.2": + version: 2.1.2 + resolution: "yoctocolors-cjs@npm:2.1.2" + checksum: 10/d731e3ba776a0ee19021d909787942933a6c2eafb2bbe85541f0c59aa5c7d475ce86fcb860d5803105e32244c3dd5ba875b87c4c6bf2d6f297da416aa54e556f languageName: node linkType: hard