@finos/legend-query-builder 4.17.99 → 4.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/QueryBuilder.d.ts.map +1 -1
- package/lib/components/QueryBuilder.js +2 -1
- package/lib/components/QueryBuilder.js.map +1 -1
- package/lib/components/QueryBuilderSideBar.d.ts.map +1 -1
- package/lib/components/QueryBuilderSideBar.js +9 -8
- package/lib/components/QueryBuilderSideBar.js.map +1 -1
- package/lib/components/explorer/QueryBuilderExplorerPanel.d.ts.map +1 -1
- package/lib/components/explorer/QueryBuilderExplorerPanel.js +48 -5
- package/lib/components/explorer/QueryBuilderExplorerPanel.js.map +1 -1
- package/lib/components/explorer/QueryBuilderRelationExplorerPanel.d.ts +24 -0
- package/lib/components/explorer/QueryBuilderRelationExplorerPanel.d.ts.map +1 -0
- package/lib/components/explorer/QueryBuilderRelationExplorerPanel.js +202 -0
- package/lib/components/explorer/QueryBuilderRelationExplorerPanel.js.map +1 -0
- package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js +3 -3
- package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.js +25 -6
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.js.map +1 -1
- package/lib/components/result/QueryBuilderResultPanel.d.ts.map +1 -1
- package/lib/components/result/QueryBuilderResultPanel.js +1 -1
- package/lib/components/result/QueryBuilderResultPanel.js.map +1 -1
- package/lib/components/result/tds/QueryBuilderTDSAsyncCellSelectionStats.d.ts +42 -0
- package/lib/components/result/tds/QueryBuilderTDSAsyncCellSelectionStats.d.ts.map +1 -0
- package/lib/components/result/tds/QueryBuilderTDSAsyncCellSelectionStats.js +212 -0
- package/lib/components/result/tds/QueryBuilderTDSAsyncCellSelectionStats.js.map +1 -0
- package/lib/components/result/tds/QueryBuilderTDSCellSelectionStats.d.ts +66 -0
- package/lib/components/result/tds/QueryBuilderTDSCellSelectionStats.d.ts.map +1 -0
- package/lib/components/result/tds/QueryBuilderTDSCellSelectionStats.js +265 -0
- package/lib/components/result/tds/QueryBuilderTDSCellSelectionStats.js.map +1 -0
- package/lib/components/result/tds/QueryBuilderTDSCellSelectionStatsBar.d.ts +28 -0
- package/lib/components/result/tds/QueryBuilderTDSCellSelectionStatsBar.d.ts.map +1 -0
- package/lib/components/result/tds/QueryBuilderTDSCellSelectionStatsBar.js +148 -0
- package/lib/components/result/tds/QueryBuilderTDSCellSelectionStatsBar.js.map +1 -0
- package/lib/components/result/tds/QueryBuilderTDSGridKeyboardShortcuts.d.ts +19 -0
- package/lib/components/result/tds/QueryBuilderTDSGridKeyboardShortcuts.d.ts.map +1 -0
- package/lib/components/result/tds/QueryBuilderTDSGridKeyboardShortcuts.js +196 -0
- package/lib/components/result/tds/QueryBuilderTDSGridKeyboardShortcuts.js.map +1 -0
- package/lib/components/result/tds/QueryBuilderTDSGridResult.d.ts +5 -0
- package/lib/components/result/tds/QueryBuilderTDSGridResult.d.ts.map +1 -1
- package/lib/components/result/tds/QueryBuilderTDSGridResult.js +64 -87
- package/lib/components/result/tds/QueryBuilderTDSGridResult.js.map +1 -1
- package/lib/components/result/tds/QueryBuilderTDSGridShared.d.ts +26 -0
- package/lib/components/result/tds/QueryBuilderTDSGridShared.d.ts.map +1 -0
- package/lib/components/result/tds/QueryBuilderTDSGridShared.js +51 -0
- package/lib/components/result/tds/QueryBuilderTDSGridShared.js.map +1 -0
- package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.d.ts +5 -0
- package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.d.ts.map +1 -1
- package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.js +169 -60
- package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.js.map +1 -1
- package/lib/components/workflows/AccessorQueryBuilder.d.ts +18 -0
- package/lib/components/workflows/AccessorQueryBuilder.d.ts.map +1 -0
- package/lib/components/workflows/AccessorQueryBuilder.js +87 -0
- package/lib/components/workflows/AccessorQueryBuilder.js.map +1 -0
- package/lib/components/workflows/ClassQueryBuilder.js +5 -5
- package/lib/components/workflows/ClassQueryBuilder.js.map +1 -1
- package/lib/data-access-overview.css +1 -1
- package/lib/graph/QueryBuilderMetaModelConst.d.ts +4 -0
- package/lib/graph/QueryBuilderMetaModelConst.d.ts.map +1 -1
- package/lib/graph/QueryBuilderMetaModelConst.js +4 -0
- package/lib/graph/QueryBuilderMetaModelConst.js.map +1 -1
- package/lib/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.js +7 -1
- package/lib/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.js.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.d.ts +2 -0
- package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.js +93 -3
- package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.js.map +1 -1
- package/lib/index.css +2 -2
- package/lib/index.css.map +1 -1
- package/lib/index.d.ts +2 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- package/lib/package.json +1 -1
- package/lib/stores/QueryBuilderConfig.d.ts +3 -0
- package/lib/stores/QueryBuilderConfig.d.ts.map +1 -1
- package/lib/stores/QueryBuilderConfig.js +3 -0
- package/lib/stores/QueryBuilderConfig.js.map +1 -1
- package/lib/stores/QueryBuilderResultState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderResultState.js +13 -3
- package/lib/stores/QueryBuilderResultState.js.map +1 -1
- package/lib/stores/QueryBuilderState.d.ts +14 -4
- package/lib/stores/QueryBuilderState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderState.js +41 -13
- package/lib/stores/QueryBuilderState.js.map +1 -1
- package/lib/stores/QueryBuilderStateBuilder.d.ts +2 -1
- package/lib/stores/QueryBuilderStateBuilder.d.ts.map +1 -1
- package/lib/stores/QueryBuilderStateBuilder.js +51 -20
- package/lib/stores/QueryBuilderStateBuilder.js.map +1 -1
- package/lib/stores/QueryBuilderStateHashUtils.d.ts +1 -0
- package/lib/stores/QueryBuilderStateHashUtils.d.ts.map +1 -1
- package/lib/stores/QueryBuilderStateHashUtils.js +1 -0
- package/lib/stores/QueryBuilderStateHashUtils.js.map +1 -1
- package/lib/stores/QueryBuilderTypeaheadHelper.js +2 -2
- package/lib/stores/QueryBuilderTypeaheadHelper.js.map +1 -1
- package/lib/stores/QueryBuilderValueSpecificationBuilder.d.ts +1 -1
- package/lib/stores/QueryBuilderValueSpecificationBuilder.d.ts.map +1 -1
- package/lib/stores/QueryBuilderValueSpecificationBuilder.js +54 -45
- package/lib/stores/QueryBuilderValueSpecificationBuilder.js.map +1 -1
- package/lib/stores/__test-utils__/QueryBuilderStateTestUtils.js +1 -1
- package/lib/stores/__test-utils__/QueryBuilderStateTestUtils.js.map +1 -1
- package/lib/stores/explorer/QueryBuilderExplorerState.d.ts +12 -2
- package/lib/stores/explorer/QueryBuilderExplorerState.d.ts.map +1 -1
- package/lib/stores/explorer/QueryBuilderExplorerState.js +12 -2
- package/lib/stores/explorer/QueryBuilderExplorerState.js.map +1 -1
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts +2 -2
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.js.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts +2 -2
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js +4 -3
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.js +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.js.map +1 -1
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSHelper.d.ts +2 -0
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSHelper.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSHelper.js +19 -0
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSHelper.js.map +1 -1
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts +7 -4
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js +59 -12
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.d.ts +16 -3
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.js +102 -24
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.js.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.d.ts +2 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.js +16 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.js.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.js +3 -3
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.js.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuilder.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuilder.js +11 -2
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuilder.js.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderTypedProjectionStateBuilder.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderTypedProjectionStateBuilder.js +16 -12
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderTypedProjectionStateBuilder.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.d.ts +4 -3
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.js +19 -9
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowStateBuilder.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowStateBuilder.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowStateBuilder.js +57 -5
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowStateBuilder.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowValueSpecificationBuilder.d.ts +4 -3
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowValueSpecificationBuilder.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowValueSpecificationBuilder.js +85 -6
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowValueSpecificationBuilder.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Average.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Average.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Average.js +3 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Average.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Count.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Count.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Count.js +3 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Count.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Max.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Max.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Max.js +3 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Max.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Min.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Min.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Min.js +3 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Min.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Sum.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Sum.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Sum.js +3 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Sum.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_AverageRank.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_AverageRank.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_AverageRank.js +4 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_AverageRank.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_DenseRank.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_DenseRank.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_DenseRank.js +3 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_DenseRank.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_Rank.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_Rank.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_Rank.js +3 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_Rank.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_RowNumber.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_RowNumber.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_RowNumber.js +3 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_RowNumber.js.map +1 -1
- package/lib/stores/milestoning/QueryBuilderMilestoningState.js +4 -4
- package/lib/stores/milestoning/QueryBuilderMilestoningState.js.map +1 -1
- package/lib/stores/workflows/MappingQueryBuilderState.js +2 -2
- package/lib/stores/workflows/MappingQueryBuilderState.js.map +1 -1
- package/lib/stores/workflows/ServiceQueryBuilderState.js +2 -2
- package/lib/stores/workflows/ServiceQueryBuilderState.js.map +1 -1
- package/lib/stores/workflows/accessor/AccessorQueryBuilderHelper.d.ts +18 -0
- package/lib/stores/workflows/accessor/AccessorQueryBuilderHelper.d.ts.map +1 -0
- package/lib/stores/workflows/accessor/AccessorQueryBuilderHelper.js +32 -0
- package/lib/stores/workflows/accessor/AccessorQueryBuilderHelper.js.map +1 -0
- package/lib/stores/workflows/accessor/AccessorQueryBuilderState.d.ts +57 -0
- package/lib/stores/workflows/accessor/AccessorQueryBuilderState.d.ts.map +1 -0
- package/lib/stores/workflows/accessor/AccessorQueryBuilderState.js +125 -0
- package/lib/stores/workflows/accessor/AccessorQueryBuilderState.js.map +1 -0
- package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.js +4 -4
- package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.js.map +1 -1
- package/package.json +7 -7
- package/src/components/QueryBuilder.tsx +2 -1
- package/src/components/QueryBuilderSideBar.tsx +12 -8
- package/src/components/explorer/QueryBuilderExplorerPanel.tsx +77 -14
- package/src/components/explorer/QueryBuilderRelationExplorerPanel.tsx +536 -0
- package/src/components/fetch-structure/QueryBuilderPostFilterPanel.tsx +1 -0
- package/src/components/fetch-structure/QueryBuilderResultModifierPanel.tsx +3 -3
- package/src/components/fetch-structure/QueryBuilderTDSPanel.tsx +62 -4
- package/src/components/result/QueryBuilderResultPanel.tsx +6 -2
- package/src/components/result/tds/QueryBuilderTDSAsyncCellSelectionStats.ts +254 -0
- package/src/components/result/tds/QueryBuilderTDSCellSelectionStats.ts +397 -0
- package/src/components/result/tds/QueryBuilderTDSCellSelectionStatsBar.tsx +439 -0
- package/src/components/result/tds/QueryBuilderTDSGridKeyboardShortcuts.ts +270 -0
- package/src/components/result/tds/QueryBuilderTDSGridResult.tsx +107 -112
- package/src/components/result/tds/QueryBuilderTDSGridShared.ts +76 -0
- package/src/components/result/tds/QueryBuilderTDSSimpleGridResult.tsx +272 -99
- package/src/components/workflows/AccessorQueryBuilder.tsx +211 -0
- package/src/components/workflows/ClassQueryBuilder.tsx +5 -5
- package/src/graph/QueryBuilderMetaModelConst.ts +5 -0
- package/src/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.ts +28 -0
- package/src/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.ts +223 -4
- package/src/index.ts +2 -0
- package/src/stores/QueryBuilderConfig.ts +3 -0
- package/src/stores/QueryBuilderResultState.ts +22 -9
- package/src/stores/QueryBuilderState.ts +47 -12
- package/src/stores/QueryBuilderStateBuilder.ts +107 -43
- package/src/stores/QueryBuilderStateHashUtils.ts +1 -0
- package/src/stores/QueryBuilderTypeaheadHelper.ts +2 -2
- package/src/stores/QueryBuilderValueSpecificationBuilder.ts +72 -59
- package/src/stores/__test-utils__/QueryBuilderStateTestUtils.ts +1 -1
- package/src/stores/explorer/QueryBuilderExplorerState.ts +26 -2
- package/src/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.ts +1 -2
- package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.ts +4 -3
- package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.ts +1 -1
- package/src/stores/fetch-structure/tds/QueryBuilderTDSHelper.ts +42 -0
- package/src/stores/fetch-structure/tds/QueryBuilderTDSState.ts +135 -19
- package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.ts +197 -38
- package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.ts +30 -0
- package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.ts +3 -3
- package/src/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuilder.ts +21 -0
- package/src/stores/fetch-structure/tds/projection/QueryBuilderTypedProjectionStateBuilder.ts +25 -16
- package/src/stores/fetch-structure/tds/window/QueryBuilderWindowState.ts +23 -9
- package/src/stores/fetch-structure/tds/window/QueryBuilderWindowStateBuilder.ts +146 -4
- package/src/stores/fetch-structure/tds/window/QueryBuilderWindowValueSpecificationBuilder.ts +145 -10
- package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator.ts +2 -0
- package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Average.ts +4 -0
- package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Count.ts +4 -0
- package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Max.ts +4 -0
- package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Min.ts +4 -0
- package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Sum.ts +4 -0
- package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_AverageRank.ts +5 -0
- package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_DenseRank.ts +4 -0
- package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_Rank.ts +4 -0
- package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_RowNumber.ts +4 -0
- package/src/stores/milestoning/QueryBuilderMilestoningState.ts +4 -4
- package/src/stores/workflows/MappingQueryBuilderState.ts +2 -2
- package/src/stores/workflows/ServiceQueryBuilderState.ts +2 -2
- package/src/stores/workflows/accessor/AccessorQueryBuilderHelper.ts +51 -0
- package/src/stores/workflows/accessor/AccessorQueryBuilderState.ts +195 -0
- package/src/stores/workflows/dataProduct/DataProductQueryBuilderState.ts +4 -4
- package/tsconfig.json +9 -0
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2020-present, Goldman Sachs
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { observer } from 'mobx-react-lite';
|
|
18
|
+
import { useRef, useLayoutEffect } from 'react';
|
|
19
|
+
import { clsx } from '@finos/legend-art';
|
|
20
|
+
import { MAXIMUM_FRACTION_DIGITS } from './QueryBuilderTDSSimpleGridResult.js';
|
|
21
|
+
import { DEFAULT_LOCALE } from '../../../graph-manager/QueryBuilderConst.js';
|
|
22
|
+
import type {
|
|
23
|
+
CellSelectionStats,
|
|
24
|
+
DistributionBucket,
|
|
25
|
+
DistributionChartType,
|
|
26
|
+
ValueFrequency,
|
|
27
|
+
} from './QueryBuilderTDSCellSelectionStats.js';
|
|
28
|
+
|
|
29
|
+
const formatNum = (value: number): string =>
|
|
30
|
+
Intl.NumberFormat(DEFAULT_LOCALE, {
|
|
31
|
+
maximumFractionDigits: MAXIMUM_FRACTION_DIGITS,
|
|
32
|
+
}).format(value);
|
|
33
|
+
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Inline loading spinner — shown while stats are being computed
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
|
|
38
|
+
const StatsSpinner = () => (
|
|
39
|
+
<span
|
|
40
|
+
className="query-builder__result__tds-grid__stats-bar__item__spinner"
|
|
41
|
+
title="Computing…"
|
|
42
|
+
/>
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
// Value-frequency tooltip (shown on Unique Count hover)
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
|
|
49
|
+
const FREQ_CHART_HEIGHT = 10; // px per row
|
|
50
|
+
const FREQ_CHART_BAR_AREA = 80; // px available for bars
|
|
51
|
+
const FREQ_LABEL_WIDTH = 90; // px for label column
|
|
52
|
+
const FREQ_COUNT_WIDTH = 30; // px for count column
|
|
53
|
+
const FREQ_TOTAL_WIDTH =
|
|
54
|
+
FREQ_LABEL_WIDTH + FREQ_CHART_BAR_AREA + FREQ_COUNT_WIDTH + 8;
|
|
55
|
+
|
|
56
|
+
const ValueFrequencyTooltip = ({
|
|
57
|
+
frequencies,
|
|
58
|
+
darkMode,
|
|
59
|
+
}: {
|
|
60
|
+
frequencies: ValueFrequency[];
|
|
61
|
+
darkMode: boolean;
|
|
62
|
+
}) => {
|
|
63
|
+
const maxCount = Math.max(...frequencies.map((f) => f.count));
|
|
64
|
+
const tooltipRef = useRef<HTMLDivElement>(null);
|
|
65
|
+
|
|
66
|
+
// After the tooltip becomes visible, clamp it within the viewport so that
|
|
67
|
+
// it never overflows off the left or right edge of the window.
|
|
68
|
+
useLayoutEffect(() => {
|
|
69
|
+
const el = tooltipRef.current;
|
|
70
|
+
if (!el) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const rect = el.getBoundingClientRect();
|
|
74
|
+
if (rect.left < 0) {
|
|
75
|
+
el.style.left = `${-rect.left + 4}px`;
|
|
76
|
+
} else if (rect.right > globalThis.innerWidth) {
|
|
77
|
+
el.style.left = `${globalThis.innerWidth - rect.right - 4}px`;
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
return (
|
|
82
|
+
<div
|
|
83
|
+
ref={tooltipRef}
|
|
84
|
+
className={clsx(
|
|
85
|
+
'query-builder__result__tds-grid__stats-bar__freq-tooltip',
|
|
86
|
+
{
|
|
87
|
+
'query-builder__result__tds-grid__stats-bar__freq-tooltip--dark':
|
|
88
|
+
darkMode,
|
|
89
|
+
},
|
|
90
|
+
)}
|
|
91
|
+
>
|
|
92
|
+
<svg
|
|
93
|
+
width={FREQ_TOTAL_WIDTH}
|
|
94
|
+
height={frequencies.length * (FREQ_CHART_HEIGHT + 3) + 2}
|
|
95
|
+
>
|
|
96
|
+
{frequencies.map((freq, i) => {
|
|
97
|
+
const y = i * (FREQ_CHART_HEIGHT + 3) + 1;
|
|
98
|
+
const barW = Math.max(
|
|
99
|
+
1,
|
|
100
|
+
(freq.count / maxCount) * FREQ_CHART_BAR_AREA,
|
|
101
|
+
);
|
|
102
|
+
const labelText =
|
|
103
|
+
freq.label.length > 12 ? `${freq.label.slice(0, 11)}…` : freq.label;
|
|
104
|
+
return (
|
|
105
|
+
<g
|
|
106
|
+
// eslint-disable-next-line react/no-array-index-key
|
|
107
|
+
key={i}
|
|
108
|
+
>
|
|
109
|
+
{/* label */}
|
|
110
|
+
<text
|
|
111
|
+
x={FREQ_LABEL_WIDTH - 4}
|
|
112
|
+
y={y + FREQ_CHART_HEIGHT - 2}
|
|
113
|
+
textAnchor="end"
|
|
114
|
+
className={clsx(
|
|
115
|
+
'query-builder__result__tds-grid__stats-bar__freq-tooltip__label',
|
|
116
|
+
{
|
|
117
|
+
'query-builder__result__tds-grid__stats-bar__freq-tooltip__label--other':
|
|
118
|
+
freq.isOther,
|
|
119
|
+
'query-builder__result__tds-grid__stats-bar__freq-tooltip__label--empty':
|
|
120
|
+
freq.isEmpty,
|
|
121
|
+
},
|
|
122
|
+
)}
|
|
123
|
+
>
|
|
124
|
+
{labelText}
|
|
125
|
+
</text>
|
|
126
|
+
{/* bar */}
|
|
127
|
+
<rect
|
|
128
|
+
x={FREQ_LABEL_WIDTH}
|
|
129
|
+
y={y}
|
|
130
|
+
width={barW}
|
|
131
|
+
height={FREQ_CHART_HEIGHT}
|
|
132
|
+
className={clsx(
|
|
133
|
+
'query-builder__result__tds-grid__stats-bar__freq-tooltip__bar',
|
|
134
|
+
{
|
|
135
|
+
'query-builder__result__tds-grid__stats-bar__freq-tooltip__bar--other':
|
|
136
|
+
freq.isOther,
|
|
137
|
+
'query-builder__result__tds-grid__stats-bar__freq-tooltip__bar--empty':
|
|
138
|
+
freq.isEmpty,
|
|
139
|
+
},
|
|
140
|
+
)}
|
|
141
|
+
/>
|
|
142
|
+
{/* count */}
|
|
143
|
+
<text
|
|
144
|
+
x={FREQ_LABEL_WIDTH + FREQ_CHART_BAR_AREA + 4}
|
|
145
|
+
y={y + FREQ_CHART_HEIGHT - 2}
|
|
146
|
+
className="query-builder__result__tds-grid__stats-bar__freq-tooltip__count"
|
|
147
|
+
>
|
|
148
|
+
{freq.count}
|
|
149
|
+
</text>
|
|
150
|
+
</g>
|
|
151
|
+
);
|
|
152
|
+
})}
|
|
153
|
+
</svg>
|
|
154
|
+
</div>
|
|
155
|
+
);
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
const formatBucketLabel = (
|
|
159
|
+
bucket: DistributionBucket,
|
|
160
|
+
chartType: DistributionChartType,
|
|
161
|
+
): string => {
|
|
162
|
+
const n = bucket.count;
|
|
163
|
+
const countLabel = `${n} ${n === 1 ? 'value' : 'values'}`;
|
|
164
|
+
|
|
165
|
+
if (chartType === 'date') {
|
|
166
|
+
const lo = bucket.lowerDateLabel ?? bucket.lower;
|
|
167
|
+
const hi = bucket.upperDateLabel ?? bucket.upper;
|
|
168
|
+
if (lo === hi) {
|
|
169
|
+
return `${countLabel} on ${lo}`;
|
|
170
|
+
}
|
|
171
|
+
return `${countLabel} within the range ${lo} – ${hi}`;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if (chartType === 'string-length') {
|
|
175
|
+
const lo = Math.round(bucket.lower);
|
|
176
|
+
const hi = Math.round(bucket.upper);
|
|
177
|
+
if (lo === hi) {
|
|
178
|
+
return `${countLabel} with length ${lo}`;
|
|
179
|
+
}
|
|
180
|
+
return `${countLabel} with length ${lo} – ${hi}`;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// numeric
|
|
184
|
+
if (bucket.lower === bucket.upper) {
|
|
185
|
+
return `${countLabel} equal to ${formatNum(bucket.lower)}`;
|
|
186
|
+
}
|
|
187
|
+
return `${countLabel} within the range ${formatNum(bucket.lower)} – ${formatNum(bucket.upper)}`;
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
// Compact SVG frequency-distribution histogram
|
|
191
|
+
const CHART_HEIGHT = 18;
|
|
192
|
+
const CHART_WIDTH = 120;
|
|
193
|
+
const BAR_GAP = 1;
|
|
194
|
+
|
|
195
|
+
const MiniHistogram = ({
|
|
196
|
+
buckets,
|
|
197
|
+
chartType,
|
|
198
|
+
darkMode,
|
|
199
|
+
}: {
|
|
200
|
+
buckets: DistributionBucket[];
|
|
201
|
+
chartType: DistributionChartType;
|
|
202
|
+
darkMode: boolean;
|
|
203
|
+
}) => {
|
|
204
|
+
if (buckets.length === 0) {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const maxCount = Math.max(...buckets.map((b) => b.count));
|
|
209
|
+
if (maxCount === 0) {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const n = buckets.length;
|
|
214
|
+
const barW = Math.max(1, (CHART_WIDTH - BAR_GAP * (n - 1)) / n);
|
|
215
|
+
|
|
216
|
+
return (
|
|
217
|
+
<div
|
|
218
|
+
className={clsx('query-builder__result__tds-grid__stats-bar__chart', {
|
|
219
|
+
'query-builder__result__tds-grid__stats-bar__chart--dark': darkMode,
|
|
220
|
+
})}
|
|
221
|
+
>
|
|
222
|
+
<svg width={CHART_WIDTH} height={CHART_HEIGHT}>
|
|
223
|
+
{buckets.map((bucket, i) => {
|
|
224
|
+
const barH = Math.max(1, (bucket.count / maxCount) * CHART_HEIGHT);
|
|
225
|
+
const x = i * (barW + BAR_GAP);
|
|
226
|
+
return (
|
|
227
|
+
<rect
|
|
228
|
+
// eslint-disable-next-line react/no-array-index-key
|
|
229
|
+
key={i}
|
|
230
|
+
x={x}
|
|
231
|
+
y={CHART_HEIGHT - barH}
|
|
232
|
+
width={barW}
|
|
233
|
+
height={barH}
|
|
234
|
+
opacity={bucket.count === 0 ? 0.15 : 1}
|
|
235
|
+
>
|
|
236
|
+
<title>{formatBucketLabel(bucket, chartType)}</title>
|
|
237
|
+
</rect>
|
|
238
|
+
);
|
|
239
|
+
})}
|
|
240
|
+
</svg>
|
|
241
|
+
</div>
|
|
242
|
+
);
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
export const QueryBuilderTDSCellSelectionStatsBar = observer(
|
|
246
|
+
(props: {
|
|
247
|
+
/** Fully-computed stats, or undefined while computation is in progress */
|
|
248
|
+
stats: CellSelectionStats | undefined;
|
|
249
|
+
/** Total number of selected cells — 0 while Phase 1 debounce is pending */
|
|
250
|
+
cellCount: number;
|
|
251
|
+
/** True once the 50 ms debounce has resolved and cellCount is accurate */
|
|
252
|
+
countReady: boolean;
|
|
253
|
+
darkMode: boolean;
|
|
254
|
+
}) => {
|
|
255
|
+
const { stats, cellCount, countReady, darkMode } = props;
|
|
256
|
+
const loading = stats === undefined;
|
|
257
|
+
const hasNumericStats = !loading && stats.sum !== undefined;
|
|
258
|
+
const hasDateStats = !loading && stats.dateMin !== undefined;
|
|
259
|
+
const hasStringStats = !loading && stats.strMinLength !== undefined;
|
|
260
|
+
const hasChart =
|
|
261
|
+
!loading &&
|
|
262
|
+
stats.distributionBuckets !== undefined &&
|
|
263
|
+
stats.distributionBuckets.length >= 2;
|
|
264
|
+
|
|
265
|
+
return (
|
|
266
|
+
<div
|
|
267
|
+
className={clsx('query-builder__result__tds-grid__stats-bar', {
|
|
268
|
+
'query-builder__result__tds-grid__stats-bar--dark': darkMode,
|
|
269
|
+
})}
|
|
270
|
+
>
|
|
271
|
+
{/* Count — spinner until Phase 1 resolves, then the number */}
|
|
272
|
+
<span
|
|
273
|
+
className={clsx('query-builder__result__tds-grid__stats-bar__item', {
|
|
274
|
+
'query-builder__result__tds-grid__stats-bar__item--has-tooltip':
|
|
275
|
+
!loading &&
|
|
276
|
+
stats.valueFrequencies !== undefined &&
|
|
277
|
+
stats.valueFrequencies.length > 0,
|
|
278
|
+
})}
|
|
279
|
+
>
|
|
280
|
+
<span className="query-builder__result__tds-grid__stats-bar__item__label">
|
|
281
|
+
Count:
|
|
282
|
+
</span>
|
|
283
|
+
<span className="query-builder__result__tds-grid__stats-bar__item__value">
|
|
284
|
+
{countReady ? cellCount : <StatsSpinner />}
|
|
285
|
+
</span>
|
|
286
|
+
{!loading &&
|
|
287
|
+
stats.valueFrequencies !== undefined &&
|
|
288
|
+
stats.valueFrequencies.length > 0 && (
|
|
289
|
+
<ValueFrequencyTooltip
|
|
290
|
+
frequencies={stats.valueFrequencies}
|
|
291
|
+
darkMode={darkMode}
|
|
292
|
+
/>
|
|
293
|
+
)}
|
|
294
|
+
</span>
|
|
295
|
+
|
|
296
|
+
{/* Unique Count — spinner while loading */}
|
|
297
|
+
<span
|
|
298
|
+
className={clsx('query-builder__result__tds-grid__stats-bar__item', {
|
|
299
|
+
'query-builder__result__tds-grid__stats-bar__item--has-tooltip':
|
|
300
|
+
!loading &&
|
|
301
|
+
stats.valueFrequencies !== undefined &&
|
|
302
|
+
stats.valueFrequencies.length > 0,
|
|
303
|
+
})}
|
|
304
|
+
>
|
|
305
|
+
<span className="query-builder__result__tds-grid__stats-bar__item__label">
|
|
306
|
+
Unique Count:
|
|
307
|
+
</span>
|
|
308
|
+
<span className="query-builder__result__tds-grid__stats-bar__item__value">
|
|
309
|
+
{loading ? <StatsSpinner /> : stats.uniqueCount}
|
|
310
|
+
</span>
|
|
311
|
+
{!loading &&
|
|
312
|
+
stats.valueFrequencies !== undefined &&
|
|
313
|
+
stats.valueFrequencies.length > 0 && (
|
|
314
|
+
<ValueFrequencyTooltip
|
|
315
|
+
frequencies={stats.valueFrequencies}
|
|
316
|
+
darkMode={darkMode}
|
|
317
|
+
/>
|
|
318
|
+
)}
|
|
319
|
+
</span>
|
|
320
|
+
|
|
321
|
+
{/* Empty Count — spinner while loading */}
|
|
322
|
+
<span
|
|
323
|
+
className={clsx('query-builder__result__tds-grid__stats-bar__item', {
|
|
324
|
+
'query-builder__result__tds-grid__stats-bar__item--has-tooltip':
|
|
325
|
+
!loading &&
|
|
326
|
+
stats.valueFrequencies !== undefined &&
|
|
327
|
+
stats.valueFrequencies.length > 0,
|
|
328
|
+
})}
|
|
329
|
+
>
|
|
330
|
+
<span className="query-builder__result__tds-grid__stats-bar__item__label">
|
|
331
|
+
Empty Count:
|
|
332
|
+
</span>
|
|
333
|
+
<span className="query-builder__result__tds-grid__stats-bar__item__value">
|
|
334
|
+
{loading ? <StatsSpinner /> : stats.nullCount}
|
|
335
|
+
</span>
|
|
336
|
+
{!loading &&
|
|
337
|
+
stats.valueFrequencies !== undefined &&
|
|
338
|
+
stats.valueFrequencies.length > 0 && (
|
|
339
|
+
<ValueFrequencyTooltip
|
|
340
|
+
frequencies={stats.valueFrequencies}
|
|
341
|
+
darkMode={darkMode}
|
|
342
|
+
/>
|
|
343
|
+
)}
|
|
344
|
+
</span>
|
|
345
|
+
|
|
346
|
+
{/* Numeric stats — only shown once loaded and applicable */}
|
|
347
|
+
{hasNumericStats && (
|
|
348
|
+
<>
|
|
349
|
+
<span className="query-builder__result__tds-grid__stats-bar__separator" />
|
|
350
|
+
<span className="query-builder__result__tds-grid__stats-bar__item">
|
|
351
|
+
<span className="query-builder__result__tds-grid__stats-bar__item__label">
|
|
352
|
+
Min:
|
|
353
|
+
</span>
|
|
354
|
+
<span className="query-builder__result__tds-grid__stats-bar__item__value">
|
|
355
|
+
{formatNum(stats.min ?? 0)}
|
|
356
|
+
</span>
|
|
357
|
+
</span>
|
|
358
|
+
<span className="query-builder__result__tds-grid__stats-bar__item">
|
|
359
|
+
<span className="query-builder__result__tds-grid__stats-bar__item__label">
|
|
360
|
+
Max:
|
|
361
|
+
</span>
|
|
362
|
+
<span className="query-builder__result__tds-grid__stats-bar__item__value">
|
|
363
|
+
{formatNum(stats.max ?? 0)}
|
|
364
|
+
</span>
|
|
365
|
+
</span>
|
|
366
|
+
<span className="query-builder__result__tds-grid__stats-bar__item">
|
|
367
|
+
<span className="query-builder__result__tds-grid__stats-bar__item__label">
|
|
368
|
+
Sum:
|
|
369
|
+
</span>
|
|
370
|
+
<span className="query-builder__result__tds-grid__stats-bar__item__value">
|
|
371
|
+
{formatNum(stats.sum ?? 0)}
|
|
372
|
+
</span>
|
|
373
|
+
</span>
|
|
374
|
+
<span className="query-builder__result__tds-grid__stats-bar__item">
|
|
375
|
+
<span className="query-builder__result__tds-grid__stats-bar__item__label">
|
|
376
|
+
Avg:
|
|
377
|
+
</span>
|
|
378
|
+
<span className="query-builder__result__tds-grid__stats-bar__item__value">
|
|
379
|
+
{formatNum(stats.avg ?? 0)}
|
|
380
|
+
</span>
|
|
381
|
+
</span>
|
|
382
|
+
</>
|
|
383
|
+
)}
|
|
384
|
+
{hasDateStats && (
|
|
385
|
+
<>
|
|
386
|
+
<span className="query-builder__result__tds-grid__stats-bar__separator" />
|
|
387
|
+
<span className="query-builder__result__tds-grid__stats-bar__item">
|
|
388
|
+
<span className="query-builder__result__tds-grid__stats-bar__item__label">
|
|
389
|
+
Min:
|
|
390
|
+
</span>
|
|
391
|
+
<span className="query-builder__result__tds-grid__stats-bar__item__value">
|
|
392
|
+
{stats.dateMin}
|
|
393
|
+
</span>
|
|
394
|
+
</span>
|
|
395
|
+
<span className="query-builder__result__tds-grid__stats-bar__item">
|
|
396
|
+
<span className="query-builder__result__tds-grid__stats-bar__item__label">
|
|
397
|
+
Max:
|
|
398
|
+
</span>
|
|
399
|
+
<span className="query-builder__result__tds-grid__stats-bar__item__value">
|
|
400
|
+
{stats.dateMax}
|
|
401
|
+
</span>
|
|
402
|
+
</span>
|
|
403
|
+
</>
|
|
404
|
+
)}
|
|
405
|
+
{hasStringStats && (
|
|
406
|
+
<>
|
|
407
|
+
<span className="query-builder__result__tds-grid__stats-bar__separator" />
|
|
408
|
+
<span className="query-builder__result__tds-grid__stats-bar__item">
|
|
409
|
+
<span className="query-builder__result__tds-grid__stats-bar__item__label">
|
|
410
|
+
Min Length:
|
|
411
|
+
</span>
|
|
412
|
+
<span className="query-builder__result__tds-grid__stats-bar__item__value">
|
|
413
|
+
{stats.strMinLength}
|
|
414
|
+
</span>
|
|
415
|
+
</span>
|
|
416
|
+
<span className="query-builder__result__tds-grid__stats-bar__item">
|
|
417
|
+
<span className="query-builder__result__tds-grid__stats-bar__item__label">
|
|
418
|
+
Max Length:
|
|
419
|
+
</span>
|
|
420
|
+
<span className="query-builder__result__tds-grid__stats-bar__item__value">
|
|
421
|
+
{stats.strMaxLength}
|
|
422
|
+
</span>
|
|
423
|
+
</span>
|
|
424
|
+
</>
|
|
425
|
+
)}
|
|
426
|
+
{hasChart && (
|
|
427
|
+
<>
|
|
428
|
+
<span className="query-builder__result__tds-grid__stats-bar__separator" />
|
|
429
|
+
<MiniHistogram
|
|
430
|
+
buckets={stats.distributionBuckets ?? []}
|
|
431
|
+
chartType={stats.distributionChartType ?? 'numeric'}
|
|
432
|
+
darkMode={darkMode}
|
|
433
|
+
/>
|
|
434
|
+
</>
|
|
435
|
+
)}
|
|
436
|
+
</div>
|
|
437
|
+
);
|
|
438
|
+
},
|
|
439
|
+
);
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026-present, Goldman Sachs
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type {
|
|
18
|
+
DataGridApi,
|
|
19
|
+
DataGridCellKeyDownEvent,
|
|
20
|
+
DataGridColumn,
|
|
21
|
+
} from '@finos/legend-lego/data-grid';
|
|
22
|
+
import type { TDSRowDataType } from '@finos/legend-graph';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Handles Excel-compatible keyboard shortcuts:
|
|
26
|
+
* Ctrl+A → select all cells
|
|
27
|
+
* Ctrl+Space → extend selection to full columns for all columns touched
|
|
28
|
+
* by the last selection range (mirrors Excel column-select)
|
|
29
|
+
* Shift+Space → extend selection to full rows for all rows touched by the
|
|
30
|
+
* last selection range (mirrors Excel row-select)
|
|
31
|
+
* Shift+PageDown → extend the last selection range one page downward
|
|
32
|
+
* Shift+PageUp → extend the last selection range one page upward
|
|
33
|
+
*
|
|
34
|
+
* Should be passed to the `onCellKeyDown` prop of both TDS DataGrid instances.
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
/** Fallback page size when the viewport row count cannot be determined. */
|
|
38
|
+
const FALLBACK_PAGE_SIZE = 25;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Returns the number of rows currently visible in the grid viewport by
|
|
42
|
+
* querying AG Grid's first/last displayed row indices. Falls back to
|
|
43
|
+
* FALLBACK_PAGE_SIZE when the API returns unusable values (e.g. during
|
|
44
|
+
* initial render before the grid has measured its height).
|
|
45
|
+
*/
|
|
46
|
+
const getViewportPageSize = (api: DataGridApi<TDSRowDataType>): number => {
|
|
47
|
+
try {
|
|
48
|
+
const first = api.getFirstDisplayedRowIndex();
|
|
49
|
+
const last = api.getLastDisplayedRowIndex();
|
|
50
|
+
if (last >= first) {
|
|
51
|
+
return Math.max(1, last - first);
|
|
52
|
+
}
|
|
53
|
+
} catch {
|
|
54
|
+
// API not ready — fall through to default
|
|
55
|
+
}
|
|
56
|
+
return FALLBACK_PAGE_SIZE;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
// Shared utility
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
|
|
63
|
+
/** Get the last cell range from the API, or null if none. */
|
|
64
|
+
const getLastRange = (
|
|
65
|
+
api: DataGridApi<TDSRowDataType>,
|
|
66
|
+
): {
|
|
67
|
+
startRow?: { rowIndex: number };
|
|
68
|
+
endRow?: { rowIndex: number };
|
|
69
|
+
columns: DataGridColumn<unknown>[];
|
|
70
|
+
} | null => {
|
|
71
|
+
const ranges = api.getCellRanges();
|
|
72
|
+
return ranges && ranges.length > 0
|
|
73
|
+
? (ranges[ranges.length - 1] as ReturnType<typeof getLastRange>)
|
|
74
|
+
: null;
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
// Individual shortcut handlers
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
|
|
81
|
+
/** Ctrl+A — select all cells */
|
|
82
|
+
const handleCtrlA = (
|
|
83
|
+
keyEvent: KeyboardEvent,
|
|
84
|
+
api: DataGridApi<TDSRowDataType>,
|
|
85
|
+
): void => {
|
|
86
|
+
keyEvent.preventDefault();
|
|
87
|
+
const rowCount = api.getDisplayedRowCount();
|
|
88
|
+
const allColumns = api.getColumns();
|
|
89
|
+
if (rowCount === 0 || !allColumns || allColumns.length === 0) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
// eslint-disable-next-line no-console
|
|
93
|
+
console.debug(
|
|
94
|
+
`[TDS Grid] Ctrl+A → selecting all: ${rowCount} rows × ${allColumns.length} columns`,
|
|
95
|
+
);
|
|
96
|
+
api.deselectAll();
|
|
97
|
+
api.clearCellSelection();
|
|
98
|
+
api.addCellRange({
|
|
99
|
+
rowStartIndex: 0,
|
|
100
|
+
rowEndIndex: rowCount - 1,
|
|
101
|
+
columns: allColumns,
|
|
102
|
+
});
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
/** Log non-modifier key presses for debugging */
|
|
106
|
+
const logKeyDown = (
|
|
107
|
+
keyEvent: KeyboardEvent,
|
|
108
|
+
column: { getColId: () => string },
|
|
109
|
+
rowIndex: number | null,
|
|
110
|
+
): void => {
|
|
111
|
+
if (
|
|
112
|
+
!keyEvent.code.startsWith('Control') &&
|
|
113
|
+
!keyEvent.code.startsWith('Shift') &&
|
|
114
|
+
!keyEvent.code.startsWith('Alt') &&
|
|
115
|
+
!keyEvent.code.startsWith('Meta')
|
|
116
|
+
) {
|
|
117
|
+
// eslint-disable-next-line no-console
|
|
118
|
+
console.debug(
|
|
119
|
+
`[TDS Grid] onCellKeyDown: key=${keyEvent.code} ctrl=${keyEvent.ctrlKey} shift=${keyEvent.shiftKey} col=${column.getColId()} row=${rowIndex}`,
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/** Shift+PageDown / Shift+PageUp — extend selection by one viewport page */
|
|
125
|
+
const handleShiftPage = (
|
|
126
|
+
keyEvent: KeyboardEvent,
|
|
127
|
+
api: DataGridApi<TDSRowDataType>,
|
|
128
|
+
column: { getColId: () => string },
|
|
129
|
+
rowIndex: number,
|
|
130
|
+
): void => {
|
|
131
|
+
keyEvent.preventDefault();
|
|
132
|
+
const rowCount = api.getDisplayedRowCount();
|
|
133
|
+
if (rowCount === 0) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const lastRange = getLastRange(api);
|
|
137
|
+
|
|
138
|
+
const rangeStartRow = lastRange?.startRow?.rowIndex ?? rowIndex;
|
|
139
|
+
const rangeEndRow = lastRange?.endRow?.rowIndex ?? rowIndex;
|
|
140
|
+
const rangeCols = lastRange
|
|
141
|
+
? lastRange.columns
|
|
142
|
+
: [column as DataGridColumn<unknown>];
|
|
143
|
+
|
|
144
|
+
const delta =
|
|
145
|
+
keyEvent.code === 'PageDown'
|
|
146
|
+
? getViewportPageSize(api)
|
|
147
|
+
: -getViewportPageSize(api);
|
|
148
|
+
const newEndRow = Math.max(0, Math.min(rowCount - 1, rangeEndRow + delta));
|
|
149
|
+
|
|
150
|
+
// eslint-disable-next-line no-console
|
|
151
|
+
console.debug(
|
|
152
|
+
`[TDS Grid] Shift+${keyEvent.code} → extending range rows ${rangeStartRow}–${newEndRow}`,
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
api.deselectAll();
|
|
156
|
+
api.clearCellSelection();
|
|
157
|
+
api.addCellRange({
|
|
158
|
+
rowStartIndex: Math.min(rangeStartRow, newEndRow),
|
|
159
|
+
rowEndIndex: Math.max(rangeStartRow, newEndRow),
|
|
160
|
+
columns: rangeCols,
|
|
161
|
+
});
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
/** Ctrl+Space — select entire columns for all columns in the last range */
|
|
165
|
+
const handleCtrlSpace = (
|
|
166
|
+
keyEvent: KeyboardEvent,
|
|
167
|
+
api: DataGridApi<TDSRowDataType>,
|
|
168
|
+
column: { getColId: () => string },
|
|
169
|
+
): void => {
|
|
170
|
+
keyEvent.preventDefault();
|
|
171
|
+
const rowCount = api.getDisplayedRowCount();
|
|
172
|
+
if (rowCount === 0) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
const lastRange = getLastRange(api);
|
|
176
|
+
const targetColumns = lastRange
|
|
177
|
+
? lastRange.columns
|
|
178
|
+
: [column as DataGridColumn<unknown>];
|
|
179
|
+
// eslint-disable-next-line no-console
|
|
180
|
+
console.debug(
|
|
181
|
+
`[TDS Grid] Ctrl+Space → selecting ${targetColumns.length} column(s), ${rowCount} rows`,
|
|
182
|
+
);
|
|
183
|
+
api.deselectAll();
|
|
184
|
+
api.clearCellSelection();
|
|
185
|
+
api.addCellRange({
|
|
186
|
+
rowStartIndex: 0,
|
|
187
|
+
rowEndIndex: rowCount - 1,
|
|
188
|
+
columns: targetColumns,
|
|
189
|
+
});
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
/** Shift+Space — select entire rows for all rows in the last range */
|
|
193
|
+
const handleShiftSpace = (
|
|
194
|
+
keyEvent: KeyboardEvent,
|
|
195
|
+
api: DataGridApi<TDSRowDataType>,
|
|
196
|
+
column: { getColId: () => string },
|
|
197
|
+
rowIndex: number,
|
|
198
|
+
): void => {
|
|
199
|
+
keyEvent.preventDefault();
|
|
200
|
+
const allColumns = api.getColumns();
|
|
201
|
+
if (!allColumns || allColumns.length === 0) {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const lastRange = getLastRange(api);
|
|
205
|
+
let startRow = rowIndex;
|
|
206
|
+
let endRow = rowIndex;
|
|
207
|
+
if (lastRange) {
|
|
208
|
+
const a = lastRange.startRow?.rowIndex ?? rowIndex;
|
|
209
|
+
const b = lastRange.endRow?.rowIndex ?? rowIndex;
|
|
210
|
+
startRow = Math.min(a, b);
|
|
211
|
+
endRow = Math.max(a, b);
|
|
212
|
+
}
|
|
213
|
+
// eslint-disable-next-line no-console
|
|
214
|
+
console.debug(
|
|
215
|
+
`[TDS Grid] Shift+Space → selecting rows ${startRow}–${endRow}, ${allColumns.length} columns`,
|
|
216
|
+
);
|
|
217
|
+
api.deselectAll();
|
|
218
|
+
api.clearCellSelection();
|
|
219
|
+
api.addCellRange({
|
|
220
|
+
rowStartIndex: startRow,
|
|
221
|
+
rowEndIndex: endRow,
|
|
222
|
+
columns: allColumns,
|
|
223
|
+
});
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
// ---------------------------------------------------------------------------
|
|
227
|
+
// Main handler (exported)
|
|
228
|
+
// ---------------------------------------------------------------------------
|
|
229
|
+
|
|
230
|
+
export const handleGridKeyboardShortcut = (
|
|
231
|
+
event: DataGridCellKeyDownEvent<TDSRowDataType>,
|
|
232
|
+
): void => {
|
|
233
|
+
const keyEvent = event.event as KeyboardEvent | undefined;
|
|
234
|
+
if (!keyEvent) {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const api: DataGridApi<TDSRowDataType> = event.api;
|
|
239
|
+
|
|
240
|
+
if (keyEvent.ctrlKey && keyEvent.code === 'KeyA') {
|
|
241
|
+
handleCtrlA(keyEvent, api);
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const column = event.column;
|
|
246
|
+
const rowIndex = event.rowIndex;
|
|
247
|
+
|
|
248
|
+
logKeyDown(keyEvent, column, rowIndex);
|
|
249
|
+
|
|
250
|
+
if (rowIndex === null) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
if (
|
|
255
|
+
keyEvent.shiftKey &&
|
|
256
|
+
(keyEvent.code === 'PageDown' || keyEvent.code === 'PageUp')
|
|
257
|
+
) {
|
|
258
|
+
handleShiftPage(keyEvent, api, column, rowIndex);
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
if (keyEvent.ctrlKey && keyEvent.code === 'Space') {
|
|
263
|
+
handleCtrlSpace(keyEvent, api, column);
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
if (keyEvent.shiftKey && keyEvent.code === 'Space') {
|
|
268
|
+
handleShiftSpace(keyEvent, api, column, rowIndex);
|
|
269
|
+
}
|
|
270
|
+
};
|