@finos/legend-cube-builder 0.0.0-stage → 0.0.2
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/LICENSE +201 -0
- package/README.md +5 -2
- package/lib/__lib__/LegendCubeCommand.d.ts +26 -0
- package/lib/__lib__/LegendCubeCommand.d.ts.map +1 -0
- package/lib/__lib__/LegendCubeCommand.js +40 -0
- package/lib/__lib__/LegendCubeCommand.js.map +1 -0
- package/lib/__lib__/LegendCubeHelpText.d.ts +19 -0
- package/lib/__lib__/LegendCubeHelpText.d.ts.map +1 -0
- package/lib/__lib__/LegendCubeHelpText.js +27 -0
- package/lib/__lib__/LegendCubeHelpText.js.map +1 -0
- package/lib/__lib__/LegendCubeLabels.d.ts +68 -0
- package/lib/__lib__/LegendCubeLabels.d.ts.map +1 -0
- package/lib/__lib__/LegendCubeLabels.js +109 -0
- package/lib/__lib__/LegendCubeLabels.js.map +1 -0
- package/lib/__lib__/LegendCubeTesting.d.ts +33 -0
- package/lib/__lib__/LegendCubeTesting.d.ts.map +1 -0
- package/lib/__lib__/LegendCubeTesting.js +34 -0
- package/lib/__lib__/LegendCubeTesting.js.map +1 -0
- package/lib/__test-utils__/CubeCanvasTestUtils.d.ts +24 -0
- package/lib/__test-utils__/CubeCanvasTestUtils.d.ts.map +1 -0
- package/lib/__test-utils__/CubeCanvasTestUtils.js +37 -0
- package/lib/__test-utils__/CubeCanvasTestUtils.js.map +1 -0
- package/lib/__test-utils__/CubeEngineTestSupport.d.ts +41 -0
- package/lib/__test-utils__/CubeEngineTestSupport.d.ts.map +1 -0
- package/lib/__test-utils__/CubeEngineTestSupport.js +76 -0
- package/lib/__test-utils__/CubeEngineTestSupport.js.map +1 -0
- package/lib/__test-utils__/CubeNorthwindTestQueries.d.ts +31 -0
- package/lib/__test-utils__/CubeNorthwindTestQueries.d.ts.map +1 -0
- package/lib/__test-utils__/CubeNorthwindTestQueries.js +102 -0
- package/lib/__test-utils__/CubeNorthwindTestQueries.js.map +1 -0
- package/lib/__test-utils__/CubePageTestUtils.d.ts +33 -0
- package/lib/__test-utils__/CubePageTestUtils.d.ts.map +1 -0
- package/lib/__test-utils__/CubePageTestUtils.js +68 -0
- package/lib/__test-utils__/CubePageTestUtils.js.map +1 -0
- package/lib/__test-utils__/CubeTestApplication.d.ts +30 -0
- package/lib/__test-utils__/CubeTestApplication.d.ts.map +1 -0
- package/lib/__test-utils__/CubeTestApplication.js +57 -0
- package/lib/__test-utils__/CubeTestApplication.js.map +1 -0
- package/lib/__test-utils__/FakeCubeEngine.d.ts +41 -0
- package/lib/__test-utils__/FakeCubeEngine.d.ts.map +1 -0
- package/lib/__test-utils__/FakeCubeEngine.js +85 -0
- package/lib/__test-utils__/FakeCubeEngine.js.map +1 -0
- package/lib/components/CubeButton.d.ts +20 -0
- package/lib/components/CubeButton.d.ts.map +1 -0
- package/lib/components/CubeButton.js +24 -0
- package/lib/components/CubeButton.js.map +1 -0
- package/lib/components/CubeEditor.d.ts +31 -0
- package/lib/components/CubeEditor.d.ts.map +1 -0
- package/lib/components/CubeEditor.js +90 -0
- package/lib/components/CubeEditor.js.map +1 -0
- package/lib/components/CubeNodeIcon.d.ts +23 -0
- package/lib/components/CubeNodeIcon.d.ts.map +1 -0
- package/lib/components/CubeNodeIcon.js +32 -0
- package/lib/components/CubeNodeIcon.js.map +1 -0
- package/lib/components/canvas/CubeCanvas.d.ts +37 -0
- package/lib/components/canvas/CubeCanvas.d.ts.map +1 -0
- package/lib/components/canvas/CubeCanvas.js +135 -0
- package/lib/components/canvas/CubeCanvas.js.map +1 -0
- package/lib/components/canvas/CubeCanvasContext.d.ts +19 -0
- package/lib/components/canvas/CubeCanvasContext.d.ts.map +1 -0
- package/lib/components/canvas/CubeCanvasContext.js +22 -0
- package/lib/components/canvas/CubeCanvasContext.js.map +1 -0
- package/lib/components/canvas/CubeCanvasContextMenu.d.ts +28 -0
- package/lib/components/canvas/CubeCanvasContextMenu.d.ts.map +1 -0
- package/lib/components/canvas/CubeCanvasContextMenu.js +35 -0
- package/lib/components/canvas/CubeCanvasContextMenu.js.map +1 -0
- package/lib/components/canvas/CubeCanvasDnd.d.ts +43 -0
- package/lib/components/canvas/CubeCanvasDnd.d.ts.map +1 -0
- package/lib/components/canvas/CubeCanvasDnd.js +51 -0
- package/lib/components/canvas/CubeCanvasDnd.js.map +1 -0
- package/lib/components/canvas/CubeCanvasEdge.d.ts +24 -0
- package/lib/components/canvas/CubeCanvasEdge.d.ts.map +1 -0
- package/lib/components/canvas/CubeCanvasEdge.js +33 -0
- package/lib/components/canvas/CubeCanvasEdge.js.map +1 -0
- package/lib/components/canvas/CubeCanvasElements.d.ts +64 -0
- package/lib/components/canvas/CubeCanvasElements.d.ts.map +1 -0
- package/lib/components/canvas/CubeCanvasElements.js +96 -0
- package/lib/components/canvas/CubeCanvasElements.js.map +1 -0
- package/lib/components/canvas/CubeCanvasLayout.d.ts +32 -0
- package/lib/components/canvas/CubeCanvasLayout.d.ts.map +1 -0
- package/lib/components/canvas/CubeCanvasLayout.js +63 -0
- package/lib/components/canvas/CubeCanvasLayout.js.map +1 -0
- package/lib/components/canvas/CubeCanvasNode.d.ts +29 -0
- package/lib/components/canvas/CubeCanvasNode.d.ts.map +1 -0
- package/lib/components/canvas/CubeCanvasNode.js +72 -0
- package/lib/components/canvas/CubeCanvasNode.js.map +1 -0
- package/lib/components/editors/CubeColumnPicker.d.ts +40 -0
- package/lib/components/editors/CubeColumnPicker.d.ts.map +1 -0
- package/lib/components/editors/CubeColumnPicker.js +51 -0
- package/lib/components/editors/CubeColumnPicker.js.map +1 -0
- package/lib/components/editors/CubeFilterEditor.d.ts +26 -0
- package/lib/components/editors/CubeFilterEditor.d.ts.map +1 -0
- package/lib/components/editors/CubeFilterEditor.js +90 -0
- package/lib/components/editors/CubeFilterEditor.js.map +1 -0
- package/lib/components/editors/CubeJoinEditor.d.ts +26 -0
- package/lib/components/editors/CubeJoinEditor.d.ts.map +1 -0
- package/lib/components/editors/CubeJoinEditor.js +76 -0
- package/lib/components/editors/CubeJoinEditor.js.map +1 -0
- package/lib/components/editors/CubeNodeEditorPanel.d.ts +29 -0
- package/lib/components/editors/CubeNodeEditorPanel.d.ts.map +1 -0
- package/lib/components/editors/CubeNodeEditorPanel.js +71 -0
- package/lib/components/editors/CubeNodeEditorPanel.js.map +1 -0
- package/lib/components/editors/CubeNodeEditorRegistry.d.ts +44 -0
- package/lib/components/editors/CubeNodeEditorRegistry.d.ts.map +1 -0
- package/lib/components/editors/CubeNodeEditorRegistry.js +30 -0
- package/lib/components/editors/CubeNodeEditorRegistry.js.map +1 -0
- package/lib/components/editors/CubeSourceEditor.d.ts +25 -0
- package/lib/components/editors/CubeSourceEditor.d.ts.map +1 -0
- package/lib/components/editors/CubeSourceEditor.js +42 -0
- package/lib/components/editors/CubeSourceEditor.js.map +1 -0
- package/lib/components/editors/CubeValueEditor.d.ts +40 -0
- package/lib/components/editors/CubeValueEditor.d.ts.map +1 -0
- package/lib/components/editors/CubeValueEditor.js +177 -0
- package/lib/components/editors/CubeValueEditor.js.map +1 -0
- package/lib/components/grid/CubeGridRegion.d.ts +23 -0
- package/lib/components/grid/CubeGridRegion.d.ts.map +1 -0
- package/lib/components/grid/CubeGridRegion.js +94 -0
- package/lib/components/grid/CubeGridRegion.js.map +1 -0
- package/lib/components/grid/CubeGridValues.d.ts +25 -0
- package/lib/components/grid/CubeGridValues.d.ts.map +1 -0
- package/lib/components/grid/CubeGridValues.js +95 -0
- package/lib/components/grid/CubeGridValues.js.map +1 -0
- package/lib/components/grid/CubeResultGrid.d.ts +26 -0
- package/lib/components/grid/CubeResultGrid.d.ts.map +1 -0
- package/lib/components/grid/CubeResultGrid.js +50 -0
- package/lib/components/grid/CubeResultGrid.js.map +1 -0
- package/lib/components/palette/CubePalette.d.ts +29 -0
- package/lib/components/palette/CubePalette.d.ts.map +1 -0
- package/lib/components/palette/CubePalette.js +73 -0
- package/lib/components/palette/CubePalette.js.map +1 -0
- package/lib/components/show-pure/CubeShowPureDialog.d.ts +23 -0
- package/lib/components/show-pure/CubeShowPureDialog.d.ts.map +1 -0
- package/lib/components/show-pure/CubeShowPureDialog.js +37 -0
- package/lib/components/show-pure/CubeShowPureDialog.js.map +1 -0
- package/lib/components/source-picker/CubeSourcePicker.d.ts +22 -0
- package/lib/components/source-picker/CubeSourcePicker.d.ts.map +1 -0
- package/lib/components/source-picker/CubeSourcePicker.js +89 -0
- package/lib/components/source-picker/CubeSourcePicker.js.map +1 -0
- package/lib/components/spec-transfer/CubeSpecTransferDialog.d.ts +26 -0
- package/lib/components/spec-transfer/CubeSpecTransferDialog.d.ts.map +1 -0
- package/lib/components/spec-transfer/CubeSpecTransferDialog.js +45 -0
- package/lib/components/spec-transfer/CubeSpecTransferDialog.js.map +1 -0
- package/lib/graph-manager/CubeEngine.d.ts +115 -0
- package/lib/graph-manager/CubeEngine.d.ts.map +1 -0
- package/lib/graph-manager/CubeEngine.js +61 -0
- package/lib/graph-manager/CubeEngine.js.map +1 -0
- package/lib/graph-manager/CubeModelOutlineHelper.d.ts +25 -0
- package/lib/graph-manager/CubeModelOutlineHelper.d.ts.map +1 -0
- package/lib/graph-manager/CubeModelOutlineHelper.js +24 -0
- package/lib/graph-manager/CubeModelOutlineHelper.js.map +1 -0
- package/lib/graph-manager/protocol/pure/CubeEngineBuilder.d.ts +26 -0
- package/lib/graph-manager/protocol/pure/CubeEngineBuilder.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/CubeEngineBuilder.js +22 -0
- package/lib/graph-manager/protocol/pure/CubeEngineBuilder.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.d.ts +27 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.js +76 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeExecutionResultReader.d.ts +27 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeExecutionResultReader.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeExecutionResultReader.js +82 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeExecutionResultReader.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.d.ts +32 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.js +195 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.d.ts +20 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.js +121 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeRelationTypeAdapter.d.ts +24 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeRelationTypeAdapter.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeRelationTypeAdapter.js +43 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeRelationTypeAdapter.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.d.ts +45 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.js +171 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.d.ts +22 -0
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.js +79 -0
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.js.map +1 -0
- package/lib/index.css +17 -0
- package/lib/index.css.map +1 -0
- package/lib/index.d.ts +25 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +24 -0
- package/lib/index.js.map +1 -0
- package/lib/stores/CubeEditorState.d.ts +206 -0
- package/lib/stores/CubeEditorState.d.ts.map +1 -0
- package/lib/stores/CubeEditorState.js +551 -0
- package/lib/stores/CubeEditorState.js.map +1 -0
- package/lib/stores/CubeExecutionState.d.ts +67 -0
- package/lib/stores/CubeExecutionState.d.ts.map +1 -0
- package/lib/stores/CubeExecutionState.js +196 -0
- package/lib/stores/CubeExecutionState.js.map +1 -0
- package/lib/stores/CubeHost.d.ts +31 -0
- package/lib/stores/CubeHost.d.ts.map +1 -0
- package/lib/stores/CubeHost.js +17 -0
- package/lib/stores/CubeHost.js.map +1 -0
- package/lib/stores/CubeNodeEditorState.d.ts +85 -0
- package/lib/stores/CubeNodeEditorState.d.ts.map +1 -0
- package/lib/stores/CubeNodeEditorState.js +207 -0
- package/lib/stores/CubeNodeEditorState.js.map +1 -0
- package/lib/stores/CubeShowPureState.d.ts +38 -0
- package/lib/stores/CubeShowPureState.d.ts.map +1 -0
- package/lib/stores/CubeShowPureState.js +83 -0
- package/lib/stores/CubeShowPureState.js.map +1 -0
- package/lib/stores/CubeSourcePickerState.d.ts +98 -0
- package/lib/stores/CubeSourcePickerState.d.ts.map +1 -0
- package/lib/stores/CubeSourcePickerState.js +334 -0
- package/lib/stores/CubeSourcePickerState.js.map +1 -0
- package/lib/stores/CubeSpecTransferState.d.ts +60 -0
- package/lib/stores/CubeSpecTransferState.d.ts.map +1 -0
- package/lib/stores/CubeSpecTransferState.js +167 -0
- package/lib/stores/CubeSpecTransferState.js.map +1 -0
- package/lib/stores/LocalModelCatalog.d.ts +37 -0
- package/lib/stores/LocalModelCatalog.d.ts.map +1 -0
- package/lib/stores/LocalModelCatalog.js +49 -0
- package/lib/stores/LocalModelCatalog.js.map +1 -0
- package/lib/stores/editors/CubeFilterDraft.d.ts +61 -0
- package/lib/stores/editors/CubeFilterDraft.d.ts.map +1 -0
- package/lib/stores/editors/CubeFilterDraft.js +186 -0
- package/lib/stores/editors/CubeFilterDraft.js.map +1 -0
- package/lib/stores/editors/CubeJoinDraft.d.ts +63 -0
- package/lib/stores/editors/CubeJoinDraft.d.ts.map +1 -0
- package/lib/stores/editors/CubeJoinDraft.js +136 -0
- package/lib/stores/editors/CubeJoinDraft.js.map +1 -0
- package/lib/stores/editors/CubeNodeDraft.d.ts +38 -0
- package/lib/stores/editors/CubeNodeDraft.d.ts.map +1 -0
- package/lib/stores/editors/CubeNodeDraft.js +35 -0
- package/lib/stores/editors/CubeNodeDraft.js.map +1 -0
- package/lib/stores/editors/CubeNodeDraftRegistry.d.ts +29 -0
- package/lib/stores/editors/CubeNodeDraftRegistry.d.ts.map +1 -0
- package/lib/stores/editors/CubeNodeDraftRegistry.js +33 -0
- package/lib/stores/editors/CubeNodeDraftRegistry.js.map +1 -0
- package/lib/stores/fixtures/CubeNorthwindModel.d.ts +23 -0
- package/lib/stores/fixtures/CubeNorthwindModel.d.ts.map +1 -0
- package/lib/stores/fixtures/CubeNorthwindModel.js +338 -0
- package/lib/stores/fixtures/CubeNorthwindModel.js.map +1 -0
- package/package.json +81 -3
- package/src/__lib__/LegendCubeCommand.ts +44 -0
- package/src/__lib__/LegendCubeHelpText.ts +38 -0
- package/src/__lib__/LegendCubeLabels.ts +141 -0
- package/src/__lib__/LegendCubeTesting.ts +33 -0
- package/src/__test-utils__/CubeCanvasTestUtils.ts +53 -0
- package/src/__test-utils__/CubeEngineTestSupport.ts +137 -0
- package/src/__test-utils__/CubeNorthwindTestQueries.ts +165 -0
- package/src/__test-utils__/CubePageTestUtils.tsx +96 -0
- package/src/__test-utils__/CubeTestApplication.ts +82 -0
- package/src/__test-utils__/FakeCubeEngine.ts +139 -0
- package/src/components/CubeButton.tsx +35 -0
- package/src/components/CubeEditor.tsx +239 -0
- package/src/components/CubeNodeIcon.tsx +47 -0
- package/src/components/canvas/CubeCanvas.tsx +260 -0
- package/src/components/canvas/CubeCanvasContext.ts +31 -0
- package/src/components/canvas/CubeCanvasContextMenu.tsx +89 -0
- package/src/components/canvas/CubeCanvasDnd.ts +82 -0
- package/src/components/canvas/CubeCanvasEdge.tsx +57 -0
- package/src/components/canvas/CubeCanvasElements.ts +150 -0
- package/src/components/canvas/CubeCanvasLayout.ts +88 -0
- package/src/components/canvas/CubeCanvasNode.tsx +141 -0
- package/src/components/editors/CubeColumnPicker.tsx +114 -0
- package/src/components/editors/CubeFilterEditor.tsx +309 -0
- package/src/components/editors/CubeJoinEditor.tsx +224 -0
- package/src/components/editors/CubeNodeEditorPanel.tsx +204 -0
- package/src/components/editors/CubeNodeEditorRegistry.ts +61 -0
- package/src/components/editors/CubeSourceEditor.tsx +116 -0
- package/src/components/editors/CubeValueEditor.tsx +332 -0
- package/src/components/grid/CubeGridRegion.tsx +274 -0
- package/src/components/grid/CubeGridValues.ts +125 -0
- package/src/components/grid/CubeResultGrid.tsx +84 -0
- package/src/components/palette/CubePalette.tsx +177 -0
- package/src/components/show-pure/CubeShowPureDialog.tsx +101 -0
- package/src/components/source-picker/CubeSourcePicker.tsx +304 -0
- package/src/components/spec-transfer/CubeSpecTransferDialog.tsx +157 -0
- package/src/graph-manager/CubeEngine.ts +155 -0
- package/src/graph-manager/CubeModelOutlineHelper.ts +32 -0
- package/src/graph-manager/protocol/pure/CubeEngineBuilder.ts +34 -0
- package/src/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.ts +109 -0
- package/src/graph-manager/protocol/pure/v1/V1_CubeExecutionResultReader.ts +115 -0
- package/src/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.ts +257 -0
- package/src/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.ts +157 -0
- package/src/graph-manager/protocol/pure/v1/V1_CubeRelationTypeAdapter.ts +58 -0
- package/src/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.ts +278 -0
- package/src/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.ts +124 -0
- package/src/index.ts +41 -0
- package/src/stores/CubeEditorState.ts +702 -0
- package/src/stores/CubeExecutionState.ts +255 -0
- package/src/stores/CubeHost.ts +32 -0
- package/src/stores/CubeNodeEditorState.ts +255 -0
- package/src/stores/CubeShowPureState.ts +96 -0
- package/src/stores/CubeSourcePickerState.ts +426 -0
- package/src/stores/CubeSpecTransferState.ts +198 -0
- package/src/stores/LocalModelCatalog.ts +70 -0
- package/src/stores/editors/CubeFilterDraft.ts +241 -0
- package/src/stores/editors/CubeJoinDraft.ts +197 -0
- package/src/stores/editors/CubeNodeDraft.ts +46 -0
- package/src/stores/editors/CubeNodeDraftRegistry.ts +49 -0
- package/src/stores/fixtures/CubeNorthwindModel.ts +355 -0
- package/tsconfig.json +118 -0
|
@@ -0,0 +1,204 @@
|
|
|
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 { QuestionCircleIcon, TimesIcon } from '@finos/legend-art';
|
|
18
|
+
import {
|
|
19
|
+
isIncompleteError,
|
|
20
|
+
isSchemasError,
|
|
21
|
+
type QueryNode,
|
|
22
|
+
type Schema,
|
|
23
|
+
UnknownNode,
|
|
24
|
+
} from '@finos/legend-cube';
|
|
25
|
+
import { observer } from 'mobx-react-lite';
|
|
26
|
+
import {
|
|
27
|
+
CUBE_NODE_HELP_TEXT,
|
|
28
|
+
SELECT_NODE_TOOLTIP,
|
|
29
|
+
} from '../../__lib__/LegendCubeHelpText.js';
|
|
30
|
+
import { READ_ONLY_CUBE_TITLE } from '../../__lib__/LegendCubeLabels.js';
|
|
31
|
+
import { LEGEND_CUBE_TEST_ID } from '../../__lib__/LegendCubeTesting.js';
|
|
32
|
+
import type { CubeEditorState } from '../../stores/CubeEditorState.js';
|
|
33
|
+
import { CUBE_NODE_DRAFT_FACTORIES } from '../../stores/editors/CubeNodeDraftRegistry.js';
|
|
34
|
+
import { CubeButton } from '../CubeButton.js';
|
|
35
|
+
import { CubeNodeIcon } from '../CubeNodeIcon.js';
|
|
36
|
+
import { CUBE_NODE_EDITORS } from './CubeNodeEditorRegistry.js';
|
|
37
|
+
|
|
38
|
+
/** The problems of the edited node against its inputs, as Apply would leave it */
|
|
39
|
+
const validateEdited = (
|
|
40
|
+
node: QueryNode,
|
|
41
|
+
inputSchemas: readonly Schema[],
|
|
42
|
+
): string[] => {
|
|
43
|
+
const errors: string[] = [];
|
|
44
|
+
node.validate(inputSchemas, errors);
|
|
45
|
+
return [...new Set(errors)];
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* The node editor, in a side panel (spec §17.5): the node's label and id, its
|
|
50
|
+
* help, Select, and its type's editor. Edits stay in the panel until Apply
|
|
51
|
+
* or closing it; Cancel drops them. While an input is missing or invalid,
|
|
52
|
+
* the panel shows why instead of the editor, since there would be no
|
|
53
|
+
* columns to pick.
|
|
54
|
+
*/
|
|
55
|
+
export const CubeNodeEditorPanel = observer(
|
|
56
|
+
(props: { editorState: CubeEditorState }) => {
|
|
57
|
+
const { editorState } = props;
|
|
58
|
+
const { nodeEditor, readOnly } = editorState;
|
|
59
|
+
const { node, draft, edited } = nodeEditor;
|
|
60
|
+
if (!node || !draft || !edited) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
const { query } = editorState.document;
|
|
64
|
+
const definition = editorState.registry.get(node.type);
|
|
65
|
+
const isCapture = query.selected === node.id;
|
|
66
|
+
const inputProblems = editorState
|
|
67
|
+
.getNodeErrors(node.id)
|
|
68
|
+
.filter((error) => isSchemasError(error) || isIncompleteError(error));
|
|
69
|
+
const inputSchemas = query
|
|
70
|
+
.getInputIds(node.id)
|
|
71
|
+
.map((inputId) =>
|
|
72
|
+
inputId === undefined
|
|
73
|
+
? undefined
|
|
74
|
+
: editorState.analysis.schemas.get(inputId),
|
|
75
|
+
)
|
|
76
|
+
.filter((schema): schema is Schema => schema !== undefined);
|
|
77
|
+
const Editor = CUBE_NODE_EDITORS.get(node.type);
|
|
78
|
+
const isEditable = CUBE_NODE_DRAFT_FACTORIES.has(node.type);
|
|
79
|
+
const problems =
|
|
80
|
+
isEditable && !inputProblems.length
|
|
81
|
+
? validateEdited(edited, inputSchemas)
|
|
82
|
+
: [];
|
|
83
|
+
return (
|
|
84
|
+
<div
|
|
85
|
+
className="flex h-full flex-col border-l border-[var(--color-border-default)] bg-[var(--color-bg-panel)]"
|
|
86
|
+
data-testid={LEGEND_CUBE_TEST_ID.NODE_EDITOR}
|
|
87
|
+
>
|
|
88
|
+
<div className="flex h-8 shrink-0 items-center gap-2 border-b border-[var(--color-border-default)] bg-[var(--color-bg-panel-header)] px-2">
|
|
89
|
+
<CubeNodeIcon
|
|
90
|
+
icon={definition?.icon}
|
|
91
|
+
className="shrink-0 text-[var(--color-text-secondary)]"
|
|
92
|
+
/>
|
|
93
|
+
<span className="min-w-0 truncate text-lg font-medium">
|
|
94
|
+
{definition?.label ?? 'Unknown'}
|
|
95
|
+
</span>
|
|
96
|
+
<span className="shrink-0 text-base text-[var(--color-text-muted)]">
|
|
97
|
+
{node.id}
|
|
98
|
+
</span>
|
|
99
|
+
{definition?.beta && (
|
|
100
|
+
<span className="shrink-0 rounded-sm bg-[var(--color-accent)] px-1 text-xs font-medium text-[var(--color-text-on-accent)]">
|
|
101
|
+
BETA
|
|
102
|
+
</span>
|
|
103
|
+
)}
|
|
104
|
+
<span
|
|
105
|
+
className="shrink-0 text-[var(--color-text-secondary)]"
|
|
106
|
+
title={
|
|
107
|
+
CUBE_NODE_HELP_TEXT[node.type] ??
|
|
108
|
+
CUBE_NODE_HELP_TEXT[UnknownNode.TYPE]
|
|
109
|
+
}
|
|
110
|
+
role="img"
|
|
111
|
+
aria-label="Help"
|
|
112
|
+
>
|
|
113
|
+
<QuestionCircleIcon />
|
|
114
|
+
</span>
|
|
115
|
+
<span className="flex-1" />
|
|
116
|
+
{isCapture ? (
|
|
117
|
+
<span
|
|
118
|
+
className="shrink-0 text-base text-[var(--color-text-secondary)]"
|
|
119
|
+
title={SELECT_NODE_TOOLTIP}
|
|
120
|
+
>
|
|
121
|
+
(Selected)
|
|
122
|
+
</span>
|
|
123
|
+
) : (
|
|
124
|
+
<button
|
|
125
|
+
className="shrink-0 text-base text-[var(--color-accent)] underline"
|
|
126
|
+
title={SELECT_NODE_TOOLTIP}
|
|
127
|
+
onClick={() => editorState.select(node.id)}
|
|
128
|
+
>
|
|
129
|
+
Select
|
|
130
|
+
</button>
|
|
131
|
+
)}
|
|
132
|
+
<button
|
|
133
|
+
className="flex h-6 w-6 shrink-0 items-center justify-center text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)]"
|
|
134
|
+
title={
|
|
135
|
+
nodeEditor.hasChanges && !readOnly
|
|
136
|
+
? 'Close, applying the changes'
|
|
137
|
+
: 'Close'
|
|
138
|
+
}
|
|
139
|
+
aria-label="Close the editor"
|
|
140
|
+
onClick={() => nodeEditor.close()}
|
|
141
|
+
>
|
|
142
|
+
<TimesIcon />
|
|
143
|
+
</button>
|
|
144
|
+
</div>
|
|
145
|
+
<div className="min-h-0 flex-1 overflow-auto p-2">
|
|
146
|
+
{inputProblems.length ? (
|
|
147
|
+
<div
|
|
148
|
+
className="text-base text-[var(--color-status-warn)]"
|
|
149
|
+
role="alert"
|
|
150
|
+
>
|
|
151
|
+
{inputProblems.map((problem) => (
|
|
152
|
+
<div key={problem}>{problem}</div>
|
|
153
|
+
))}
|
|
154
|
+
</div>
|
|
155
|
+
) : Editor ? (
|
|
156
|
+
<Editor
|
|
157
|
+
editorState={editorState}
|
|
158
|
+
draft={draft}
|
|
159
|
+
inputSchemas={inputSchemas}
|
|
160
|
+
readOnly={readOnly}
|
|
161
|
+
/>
|
|
162
|
+
) : (
|
|
163
|
+
<div className="text-base text-[var(--color-text-secondary)]">
|
|
164
|
+
{`${node.describe()}: this node can't be edited.`}
|
|
165
|
+
</div>
|
|
166
|
+
)}
|
|
167
|
+
{problems.length > 0 && (
|
|
168
|
+
<div
|
|
169
|
+
className="mt-3 border-t border-[var(--color-border-subtle)] pt-2 text-base text-[var(--color-status-error)]"
|
|
170
|
+
role="alert"
|
|
171
|
+
aria-label="Problems"
|
|
172
|
+
>
|
|
173
|
+
{problems.map((problem) => (
|
|
174
|
+
<div key={problem}>{problem}</div>
|
|
175
|
+
))}
|
|
176
|
+
</div>
|
|
177
|
+
)}
|
|
178
|
+
</div>
|
|
179
|
+
{isEditable && (
|
|
180
|
+
<div className="flex h-10 shrink-0 items-center justify-end gap-2 border-t border-[var(--color-border-default)] px-2">
|
|
181
|
+
<CubeButton
|
|
182
|
+
title="Drop the changes and close"
|
|
183
|
+
onClick={() => nodeEditor.cancel()}
|
|
184
|
+
>
|
|
185
|
+
Cancel
|
|
186
|
+
</CubeButton>
|
|
187
|
+
<CubeButton
|
|
188
|
+
primary={true}
|
|
189
|
+
title={
|
|
190
|
+
readOnly
|
|
191
|
+
? READ_ONLY_CUBE_TITLE
|
|
192
|
+
: 'Store the changes, as one step to undo'
|
|
193
|
+
}
|
|
194
|
+
disabled={readOnly || !nodeEditor.hasChanges}
|
|
195
|
+
onClick={() => nodeEditor.apply()}
|
|
196
|
+
>
|
|
197
|
+
Apply
|
|
198
|
+
</CubeButton>
|
|
199
|
+
</div>
|
|
200
|
+
)}
|
|
201
|
+
</div>
|
|
202
|
+
);
|
|
203
|
+
},
|
|
204
|
+
);
|
|
@@ -0,0 +1,61 @@
|
|
|
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 {
|
|
18
|
+
Filter,
|
|
19
|
+
Join,
|
|
20
|
+
RelationalTableSource,
|
|
21
|
+
type Schema,
|
|
22
|
+
} from '@finos/legend-cube';
|
|
23
|
+
import type { CubeEditorState } from '../../stores/CubeEditorState.js';
|
|
24
|
+
import type { CubeNodeDraft } from '../../stores/editors/CubeNodeDraft.js';
|
|
25
|
+
import { CubeFilterEditor } from './CubeFilterEditor.js';
|
|
26
|
+
import { CubeJoinEditor } from './CubeJoinEditor.js';
|
|
27
|
+
import { CubeSourceEditor } from './CubeSourceEditor.js';
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* What the panel gives a node type's editor (PLAN §7.4). Edits go to the
|
|
31
|
+
* draft, which the panel's Apply stores; an action on the document goes
|
|
32
|
+
* through `editorState.nodeEditor` (e.g. `swapInputs`), which applies the
|
|
33
|
+
* draft first, so the panel never loses its edits under a replaced node.
|
|
34
|
+
*/
|
|
35
|
+
export interface CubeNodeEditorProps {
|
|
36
|
+
readonly editorState: CubeEditorState;
|
|
37
|
+
/** The node's draft, made by its type's factory in `CUBE_NODE_DRAFT_FACTORIES` */
|
|
38
|
+
readonly draft: CubeNodeDraft;
|
|
39
|
+
/**
|
|
40
|
+
* The schemas of the node's inputs, in port order, e.g. a Join's Left then
|
|
41
|
+
* Right. All are there: the panel shows the upstream error instead of the
|
|
42
|
+
* editor while an input is missing or invalid.
|
|
43
|
+
*/
|
|
44
|
+
readonly inputSchemas: readonly Schema[];
|
|
45
|
+
/** The cube was saved by a newer version: show, don't edit */
|
|
46
|
+
readonly readOnly: boolean;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* The editor of each node type, by type. A type without one shows its
|
|
51
|
+
* description; a type with one either has a draft factory in
|
|
52
|
+
* `CUBE_NODE_DRAFT_FACTORIES` or edits nothing (a source).
|
|
53
|
+
*/
|
|
54
|
+
export const CUBE_NODE_EDITORS: ReadonlyMap<
|
|
55
|
+
string,
|
|
56
|
+
React.FC<CubeNodeEditorProps>
|
|
57
|
+
> = new Map<string, React.FC<CubeNodeEditorProps>>([
|
|
58
|
+
[RelationalTableSource.TYPE, CubeSourceEditor],
|
|
59
|
+
[Filter.TYPE, CubeFilterEditor],
|
|
60
|
+
[Join.TYPE, CubeJoinEditor],
|
|
61
|
+
]);
|
|
@@ -0,0 +1,116 @@
|
|
|
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 { PanelLoadingIndicator } from '@finos/legend-art';
|
|
18
|
+
import {
|
|
19
|
+
getRelationalDisplayName,
|
|
20
|
+
RelationalTableSource,
|
|
21
|
+
} from '@finos/legend-cube';
|
|
22
|
+
import { guaranteeType } from '@finos/legend-shared';
|
|
23
|
+
import { flowResult } from 'mobx';
|
|
24
|
+
import { observer } from 'mobx-react-lite';
|
|
25
|
+
import {
|
|
26
|
+
CUBE_PENDING_LABEL,
|
|
27
|
+
getColumnTypeLabel,
|
|
28
|
+
} from '../../__lib__/LegendCubeLabels.js';
|
|
29
|
+
import { CubeButton } from '../CubeButton.js';
|
|
30
|
+
import { CubeColumnTypeIcon } from './CubeColumnPicker.js';
|
|
31
|
+
import type { CubeNodeEditorProps } from './CubeNodeEditorRegistry.js';
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* A table source (spec §17.6): where it reads from, its columns as the engine
|
|
35
|
+
* typed them, and Refresh, which types the table again. Nothing here is
|
|
36
|
+
* edited, so a refresh is no undo step.
|
|
37
|
+
*/
|
|
38
|
+
export const CubeSourceEditor = observer((props: CubeNodeEditorProps) => {
|
|
39
|
+
const { editorState } = props;
|
|
40
|
+
const source = guaranteeType(props.draft.original, RelationalTableSource);
|
|
41
|
+
const refreshing = editorState.isPendingSource(source);
|
|
42
|
+
const { resolution } = source;
|
|
43
|
+
const warnings = editorState.warnings.get(source.key) ?? [];
|
|
44
|
+
return (
|
|
45
|
+
<div className="relative flex flex-col gap-2">
|
|
46
|
+
<dl className="grid grid-cols-[max-content_1fr] gap-x-3 gap-y-1 text-base">
|
|
47
|
+
<dt className="text-[var(--color-text-secondary)]">Database</dt>
|
|
48
|
+
<dd className="min-w-0 break-all">{source.database}</dd>
|
|
49
|
+
<dt className="text-[var(--color-text-secondary)]">Schema</dt>
|
|
50
|
+
<dd>{getRelationalDisplayName(source.schema)}</dd>
|
|
51
|
+
<dt className="text-[var(--color-text-secondary)]">Table</dt>
|
|
52
|
+
<dd>{getRelationalDisplayName(source.table)}</dd>
|
|
53
|
+
</dl>
|
|
54
|
+
<div className="flex items-center gap-2">
|
|
55
|
+
<CubeButton
|
|
56
|
+
title="Type the table again with the engine, e.g. after its columns changed"
|
|
57
|
+
disabled={refreshing}
|
|
58
|
+
onClick={() => {
|
|
59
|
+
flowResult(editorState.refreshSource(source.id)).catch(
|
|
60
|
+
editorState.host.applicationStore.alertUnhandledError,
|
|
61
|
+
);
|
|
62
|
+
}}
|
|
63
|
+
>
|
|
64
|
+
Refresh
|
|
65
|
+
</CubeButton>
|
|
66
|
+
{refreshing && (
|
|
67
|
+
<span className="text-base text-[var(--color-text-secondary)]">
|
|
68
|
+
{CUBE_PENDING_LABEL.REFRESHING_SOURCE}
|
|
69
|
+
</span>
|
|
70
|
+
)}
|
|
71
|
+
</div>
|
|
72
|
+
<PanelLoadingIndicator isLoading={refreshing} />
|
|
73
|
+
{warnings.map((warning) => (
|
|
74
|
+
<div
|
|
75
|
+
key={warning}
|
|
76
|
+
className="text-sm text-[var(--color-status-warn)]"
|
|
77
|
+
role="status"
|
|
78
|
+
>
|
|
79
|
+
{warning}
|
|
80
|
+
</div>
|
|
81
|
+
))}
|
|
82
|
+
{resolution.kind === 'resolved' ? (
|
|
83
|
+
<table className="w-full text-base" aria-label="Columns">
|
|
84
|
+
<thead>
|
|
85
|
+
<tr className="text-left text-[var(--color-text-secondary)]">
|
|
86
|
+
<th className="font-normal">Column</th>
|
|
87
|
+
<th className="font-normal">Type</th>
|
|
88
|
+
</tr>
|
|
89
|
+
</thead>
|
|
90
|
+
<tbody>
|
|
91
|
+
{resolution.schema.columns.map((column) => (
|
|
92
|
+
<tr key={column.name}>
|
|
93
|
+
<td className="break-all pr-2">{column.name}</td>
|
|
94
|
+
<td title={column.type.fullName}>
|
|
95
|
+
<span className="flex items-center gap-1">
|
|
96
|
+
<CubeColumnTypeIcon
|
|
97
|
+
type={column.type}
|
|
98
|
+
className="text-[var(--color-text-secondary)]"
|
|
99
|
+
/>
|
|
100
|
+
{getColumnTypeLabel(column)}
|
|
101
|
+
</span>
|
|
102
|
+
</td>
|
|
103
|
+
</tr>
|
|
104
|
+
))}
|
|
105
|
+
</tbody>
|
|
106
|
+
</table>
|
|
107
|
+
) : (
|
|
108
|
+
<div className="text-base text-[var(--color-text-secondary)]">
|
|
109
|
+
{resolution.kind === 'failed'
|
|
110
|
+
? resolution.message
|
|
111
|
+
: 'The table has not been typed yet.'}
|
|
112
|
+
</div>
|
|
113
|
+
)}
|
|
114
|
+
</div>
|
|
115
|
+
);
|
|
116
|
+
});
|