@finos/legend-data-cube 0.0.36 → 0.0.37
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/README.md +1 -1
- package/lib/__lib__/DataCubeEvent.d.ts +21 -0
- package/lib/__lib__/DataCubeEvent.d.ts.map +1 -0
- package/lib/__lib__/DataCubeEvent.js +22 -0
- package/lib/__lib__/DataCubeEvent.js.map +1 -0
- package/lib/components/DataCube.d.ts +3 -1
- package/lib/components/DataCube.d.ts.map +1 -1
- package/lib/components/DataCube.js +10 -9
- package/lib/components/DataCube.js.map +1 -1
- package/lib/components/DataCubeProvider.js +1 -1
- package/lib/components/DataCubeProvider.js.map +1 -1
- package/lib/components/core/DataCubeAlert.d.ts +3 -2
- package/lib/components/core/DataCubeAlert.d.ts.map +1 -1
- package/lib/components/core/DataCubeAlert.js +4 -2
- package/lib/components/core/DataCubeAlert.js.map +1 -1
- package/lib/components/core/DataCubeFormUtils.d.ts +26 -0
- package/lib/components/core/DataCubeFormUtils.d.ts.map +1 -1
- package/lib/components/core/DataCubeFormUtils.js +127 -4
- package/lib/components/core/DataCubeFormUtils.js.map +1 -1
- package/lib/components/core/DataCubeLayoutManager.js +1 -1
- package/lib/components/core/DataCubeLayoutManager.js.map +1 -1
- package/lib/components/core/DataCubeSettingsPanel.d.ts.map +1 -1
- package/lib/components/core/DataCubeSettingsPanel.js +53 -27
- package/lib/components/core/DataCubeSettingsPanel.js.map +1 -1
- package/lib/components/view/editor/DataCubeEditor.d.ts.map +1 -1
- package/lib/components/view/editor/DataCubeEditor.js +6 -5
- package/lib/components/view/editor/DataCubeEditor.js.map +1 -1
- package/lib/components/view/editor/DataCubeEditorColumnPropertiesPanel.d.ts.map +1 -1
- package/lib/components/view/editor/DataCubeEditorColumnPropertiesPanel.js +4 -4
- package/lib/components/view/editor/DataCubeEditorColumnPropertiesPanel.js.map +1 -1
- package/lib/components/view/editor/DataCubeEditorGeneralPropertiesPanel.d.ts.map +1 -1
- package/lib/components/view/editor/DataCubeEditorGeneralPropertiesPanel.js +2 -2
- package/lib/components/view/editor/DataCubeEditorGeneralPropertiesPanel.js.map +1 -1
- package/lib/components/view/extend/DataCubeColumnEditor.d.ts.map +1 -1
- package/lib/components/view/extend/DataCubeColumnEditor.js +12 -12
- package/lib/components/view/extend/DataCubeColumnEditor.js.map +1 -1
- package/lib/components/view/filter/DataCubeFilterEditor.d.ts.map +1 -1
- package/lib/components/view/filter/DataCubeFilterEditor.js +4 -4
- package/lib/components/view/filter/DataCubeFilterEditor.js.map +1 -1
- package/lib/components/view/grid/DataCubeGrid.d.ts.map +1 -1
- package/lib/components/view/grid/DataCubeGrid.js +7 -7
- package/lib/components/view/grid/DataCubeGrid.js.map +1 -1
- package/lib/index.css +1 -1
- package/lib/index.d.ts +7 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +7 -2
- package/lib/index.js.map +1 -1
- package/lib/package.json +2 -2
- package/lib/stores/DataCubeOptions.d.ts +6 -5
- package/lib/stores/DataCubeOptions.d.ts.map +1 -1
- package/lib/stores/DataCubeSettings.d.ts +25 -22
- package/lib/stores/DataCubeSettings.d.ts.map +1 -1
- package/lib/stores/DataCubeSettings.js +250 -62
- package/lib/stores/DataCubeSettings.js.map +1 -1
- package/lib/stores/DataCubeState.d.ts +8 -5
- package/lib/stores/DataCubeState.d.ts.map +1 -1
- package/lib/stores/DataCubeState.js +27 -42
- package/lib/stores/DataCubeState.js.map +1 -1
- package/lib/stores/core/DataCubeEngine.d.ts +15 -18
- package/lib/stores/core/DataCubeEngine.d.ts.map +1 -1
- package/lib/stores/core/DataCubeEngine.js +5 -16
- package/lib/stores/core/DataCubeEngine.js.map +1 -1
- package/lib/stores/core/DataCubeQueryBuilder.d.ts +1 -0
- package/lib/stores/core/DataCubeQueryBuilder.d.ts.map +1 -1
- package/lib/stores/core/DataCubeQueryBuilder.js.map +1 -1
- package/lib/stores/core/DataCubeQueryBuilderUtils.d.ts +3 -0
- package/lib/stores/core/DataCubeQueryBuilderUtils.d.ts.map +1 -1
- package/lib/stores/core/DataCubeQueryBuilderUtils.js +12 -1
- package/lib/stores/core/DataCubeQueryBuilderUtils.js.map +1 -1
- package/lib/stores/core/DataCubeQuerySnapshotBuilder.d.ts.map +1 -1
- package/lib/stores/core/DataCubeQuerySnapshotBuilder.js +46 -30
- package/lib/stores/core/DataCubeQuerySnapshotBuilder.js.map +1 -1
- package/lib/stores/core/DataCubeSetting.d.ts +51 -0
- package/lib/stores/core/DataCubeSetting.d.ts.map +1 -0
- package/lib/stores/core/DataCubeSetting.js +36 -0
- package/lib/stores/core/DataCubeSetting.js.map +1 -0
- package/lib/stores/core/models/AdhocQueryDataCubeSource.d.ts +29 -0
- package/lib/stores/core/models/AdhocQueryDataCubeSource.d.ts.map +1 -0
- package/lib/stores/core/models/AdhocQueryDataCubeSource.js +35 -0
- package/lib/stores/core/models/AdhocQueryDataCubeSource.js.map +1 -0
- package/lib/stores/core/models/DataCubeSource.d.ts +1 -1
- package/lib/stores/core/models/DataCubeSource.d.ts.map +1 -1
- package/lib/stores/core/models/DataCubeSource.js +1 -1
- package/lib/stores/core/models/DataCubeSource.js.map +1 -1
- package/lib/stores/view/DataCubeQuerySnapshotManager.d.ts.map +1 -1
- package/lib/stores/view/DataCubeQuerySnapshotManager.js +9 -2
- package/lib/stores/view/DataCubeQuerySnapshotManager.js.map +1 -1
- package/lib/stores/view/DataCubeViewState.d.ts +1 -1
- package/lib/stores/view/DataCubeViewState.d.ts.map +1 -1
- package/lib/stores/view/DataCubeViewState.js +5 -14
- package/lib/stores/view/DataCubeViewState.js.map +1 -1
- package/lib/stores/view/extend/DataCubeColumnEditorState.d.ts.map +1 -1
- package/lib/stores/view/extend/DataCubeColumnEditorState.js +5 -5
- package/lib/stores/view/extend/DataCubeColumnEditorState.js.map +1 -1
- package/lib/stores/view/grid/DataCubeGridClientEngine.d.ts +1 -1
- package/lib/stores/view/grid/DataCubeGridClientEngine.d.ts.map +1 -1
- package/lib/stores/view/grid/DataCubeGridClientEngine.js +11 -7
- package/lib/stores/view/grid/DataCubeGridClientEngine.js.map +1 -1
- package/lib/stores/view/grid/DataCubeGridQueryBuilder.d.ts.map +1 -1
- package/lib/stores/view/grid/DataCubeGridQueryBuilder.js +2 -2
- package/lib/stores/view/grid/DataCubeGridQueryBuilder.js.map +1 -1
- package/lib/stores/view/grid/DataCubeGridState.d.ts +1 -0
- package/lib/stores/view/grid/DataCubeGridState.d.ts.map +1 -1
- package/lib/stores/view/grid/DataCubeGridState.js +8 -3
- package/lib/stores/view/grid/DataCubeGridState.js.map +1 -1
- package/package.json +6 -6
- package/src/__lib__/DataCubeEvent.ts +21 -0
- package/src/components/DataCube.tsx +14 -8
- package/src/components/DataCubeProvider.tsx +1 -1
- package/src/components/core/DataCubeAlert.tsx +12 -7
- package/src/components/core/DataCubeFormUtils.tsx +245 -16
- package/src/components/core/DataCubeLayoutManager.tsx +1 -1
- package/src/components/core/DataCubeSettingsPanel.tsx +166 -134
- package/src/components/view/editor/DataCubeEditor.tsx +12 -16
- package/src/components/view/editor/DataCubeEditorColumnPropertiesPanel.tsx +6 -5
- package/src/components/view/editor/DataCubeEditorGeneralPropertiesPanel.tsx +4 -3
- package/src/components/view/extend/DataCubeColumnEditor.tsx +24 -28
- package/src/components/view/filter/DataCubeFilterEditor.tsx +10 -18
- package/src/components/view/grid/DataCubeGrid.tsx +8 -7
- package/src/index.tsx +13 -2
- package/src/stores/DataCubeOptions.ts +14 -10
- package/src/stores/DataCubeSettings.tsx +421 -0
- package/src/stores/DataCubeState.tsx +38 -51
- package/src/stores/core/DataCubeEngine.tsx +45 -62
- package/src/stores/core/DataCubeQueryBuilder.ts +1 -0
- package/src/stores/core/DataCubeQueryBuilderUtils.ts +17 -0
- package/src/stores/core/DataCubeQuerySnapshotBuilder.ts +59 -30
- package/src/stores/core/DataCubeSetting.ts +63 -0
- package/src/stores/core/models/AdhocQueryDataCubeSource.ts +45 -0
- package/src/stores/core/models/DataCubeSource.ts +1 -1
- package/src/stores/view/DataCubeQuerySnapshotManager.ts +16 -4
- package/src/stores/view/DataCubeViewState.ts +8 -17
- package/src/stores/view/extend/DataCubeColumnEditorState.tsx +8 -6
- package/src/stores/view/grid/DataCubeGridClientEngine.ts +22 -11
- package/src/stores/view/grid/DataCubeGridQueryBuilder.ts +7 -1
- package/src/stores/view/grid/DataCubeGridState.ts +17 -3
- package/tsconfig.json +4 -1
- package/src/stores/DataCubeSettings.ts +0 -107
|
@@ -21,6 +21,7 @@ import { generateGridOptionsFromSnapshot } from './DataCubeGridConfigurationBuil
|
|
|
21
21
|
import { DataCubeConfiguration } from '../../core/models/DataCubeConfiguration.js';
|
|
22
22
|
import { DataCubeGridControllerState } from './DataCubeGridControllerState.js';
|
|
23
23
|
import { DataCubeGridClientExportEngine } from './DataCubeGridClientExportEngine.js';
|
|
24
|
+
import { DataCubeSettingKey } from '../../core/DataCubeSetting.js';
|
|
24
25
|
/**
|
|
25
26
|
* This query editor state is responsible for syncing the internal state of ag-grid
|
|
26
27
|
* server-side row model data source with the data cube query state. When new snapshot
|
|
@@ -52,7 +53,7 @@ export class DataCubeGridState extends DataCubeQuerySnapshotController {
|
|
|
52
53
|
super(view);
|
|
53
54
|
makeObservable(this, {
|
|
54
55
|
clientDataSource: observable,
|
|
55
|
-
queryConfiguration: observable
|
|
56
|
+
queryConfiguration: observable,
|
|
56
57
|
rowLimit: observable,
|
|
57
58
|
isPaginationEnabled: observable,
|
|
58
59
|
setPaginationEnabled: action,
|
|
@@ -83,6 +84,9 @@ export class DataCubeGridState extends DataCubeQuerySnapshotController {
|
|
|
83
84
|
setScrollHintText(val) {
|
|
84
85
|
this.scrollHintText = val;
|
|
85
86
|
}
|
|
87
|
+
get isClientConfigured() {
|
|
88
|
+
return Boolean(this._client);
|
|
89
|
+
}
|
|
86
90
|
get client() {
|
|
87
91
|
return guaranteeNonNullable(this._client, 'Grid client is not configured');
|
|
88
92
|
}
|
|
@@ -98,7 +102,7 @@ export class DataCubeGridState extends DataCubeQuerySnapshotController {
|
|
|
98
102
|
this.queryConfiguration = configuration;
|
|
99
103
|
this.rowLimit = snapshot.data.limit;
|
|
100
104
|
const gridOptions = generateGridOptionsFromSnapshot(snapshot, configuration, this.view);
|
|
101
|
-
if (this.view.dataCube.settings.
|
|
105
|
+
if (this.view.dataCube.settings.getBooleanValue(DataCubeSettingKey.DEBUGGER__ENABLE_DEBUG_MODE)) {
|
|
102
106
|
this.view.engine.debugProcess(`New Grid Options`, [
|
|
103
107
|
'Grid Options',
|
|
104
108
|
gridOptions,
|
|
@@ -106,7 +110,8 @@ export class DataCubeGridState extends DataCubeQuerySnapshotController {
|
|
|
106
110
|
}
|
|
107
111
|
this.client.updateGridOptions({
|
|
108
112
|
...gridOptions,
|
|
109
|
-
rowBuffer: this.view.dataCube.settings.
|
|
113
|
+
rowBuffer: this.view.dataCube.settings.getNumericValue(DataCubeSettingKey.GRID_CLIENT__ROW_BUFFER),
|
|
114
|
+
purgeClosedRowNodes: this.view.dataCube.settings.getBooleanValue(DataCubeSettingKey.GRID_CLIENT__PURGE_CLOSED_ROW_NODES),
|
|
110
115
|
// NOTE: ag-grid uses the cache block size as page size, so it's important to set this
|
|
111
116
|
// in corresponding to the pagination setting, else it would cause unexpected scrolling behavior
|
|
112
117
|
cacheBlockSize: this.isPaginationEnabled
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataCubeGridState.js","sourceRoot":"","sources":["../../../../src/stores/view/grid/DataCubeGridState.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,QAAQ,EACR,oBAAoB,GAErB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAG1D,OAAO,EACL,sCAAsC,EACtC,8CAA8C,EAC9C,yDAAyD,EACzD,0CAA0C,EAC1C,+CAA+C,EAC/C,wCAAwC,GACzC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,+BAA+B,EAAE,MAAM,oCAAoC,CAAC;AAErF,OAAO,EAAE,+BAA+B,EAAE,MAAM,uCAAuC,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"DataCubeGridState.js","sourceRoot":"","sources":["../../../../src/stores/view/grid/DataCubeGridState.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@finos/legend-data-cube",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "Legend
|
|
3
|
+
"version": "0.0.37",
|
|
4
|
+
"description": "Legend DataCube",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"legend",
|
|
7
7
|
"legend-data-cube",
|
|
@@ -42,10 +42,10 @@
|
|
|
42
42
|
"test:watch": "jest --watch"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@finos/legend-art": "7.1.
|
|
46
|
-
"@finos/legend-code-editor": "2.0.
|
|
47
|
-
"@finos/legend-graph": "
|
|
48
|
-
"@finos/legend-shared": "10.0.
|
|
45
|
+
"@finos/legend-art": "7.1.73",
|
|
46
|
+
"@finos/legend-code-editor": "2.0.32",
|
|
47
|
+
"@finos/legend-graph": "32.0.0",
|
|
48
|
+
"@finos/legend-shared": "10.0.65",
|
|
49
49
|
"@types/react": "19.0.2",
|
|
50
50
|
"ag-grid-community": "33.0.3",
|
|
51
51
|
"ag-grid-enterprise": "33.0.3",
|
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
export enum DataCubeEvent {
|
|
18
|
+
SETTINGS__FAILURE__FOUND_UNREGISTERED_SETTING = 'data-cube.settings.failure.found-unregistered-setting',
|
|
19
|
+
SETTINGS__FAILURE__ASSIGN_INCOMPATIBLE_VALUE = 'data-cube.settings.failure.assign-incompatible-value',
|
|
20
|
+
SETTINGS__FAILURE__RETRIEVE_INCOMPATIBLE_VALUE = 'data-cube.settings.failure.retrieve-incompatible-value',
|
|
21
|
+
}
|
|
@@ -30,6 +30,8 @@ import type { DataCubeEngine } from '../stores/core/DataCubeEngine.js';
|
|
|
30
30
|
import { DataCubeState } from '../stores/DataCubeState.js';
|
|
31
31
|
import { type DataCubeOptions } from '../stores/DataCubeOptions.js';
|
|
32
32
|
import { DataCubeContextProvider, useDataCube } from './DataCubeProvider.js';
|
|
33
|
+
import type { DataCubeQuery } from '../stores/core/models/DataCubeQuery.js';
|
|
34
|
+
import { FormBadge_WIP } from './core/DataCubeFormUtils.js';
|
|
33
35
|
|
|
34
36
|
const DataCubeTitleBar = observer(() => {
|
|
35
37
|
const dataCube = useDataCube();
|
|
@@ -59,7 +61,7 @@ const DataCubeTitleBar = observer(() => {
|
|
|
59
61
|
transformOrigin: { vertical: 'top', horizontal: 'left' },
|
|
60
62
|
classes: {
|
|
61
63
|
paper: 'rounded-none mt-[1px]',
|
|
62
|
-
list: 'w-
|
|
64
|
+
list: 'w-40 p-0 rounded-none border border-neutral-400 bg-white max-h-40 overflow-y-auto py-0.5',
|
|
63
65
|
},
|
|
64
66
|
}}
|
|
65
67
|
>
|
|
@@ -75,12 +77,13 @@ const DataCubeTitleBar = observer(() => {
|
|
|
75
77
|
disabled={true} // TODO: enable when we set up the documentation website
|
|
76
78
|
>
|
|
77
79
|
See Documentation
|
|
80
|
+
<FormBadge_WIP />
|
|
78
81
|
</DropdownMenuItem>
|
|
79
82
|
<div className="my-0.5 h-[1px] w-full bg-neutral-200" />
|
|
80
83
|
<DropdownMenuItem
|
|
81
84
|
className="flex h-[22px] w-full items-center px-2.5 text-base hover:bg-neutral-100 focus:bg-neutral-100"
|
|
82
85
|
onClick={() => {
|
|
83
|
-
view.dataCube.
|
|
86
|
+
view.dataCube.settings.display.open();
|
|
84
87
|
closeMenuDropdown();
|
|
85
88
|
}}
|
|
86
89
|
>
|
|
@@ -99,7 +102,7 @@ const DataCubeRoot = observer(() => {
|
|
|
99
102
|
|
|
100
103
|
useEffect(() => {
|
|
101
104
|
dataCube.view
|
|
102
|
-
.initialize()
|
|
105
|
+
.initialize(dataCube.query)
|
|
103
106
|
.catch((error) => dataCube.engine.logUnhandledError(error));
|
|
104
107
|
}, [dataCube]);
|
|
105
108
|
|
|
@@ -118,11 +121,14 @@ const DataCubeRoot = observer(() => {
|
|
|
118
121
|
|
|
119
122
|
export const DataCube = observer(
|
|
120
123
|
(props: {
|
|
124
|
+
query: DataCubeQuery;
|
|
121
125
|
engine: DataCubeEngine;
|
|
122
126
|
options?: DataCubeOptions | undefined;
|
|
123
|
-
})
|
|
124
|
-
const { engine, options } = props;
|
|
125
|
-
const state = useLocalObservable(
|
|
127
|
+
}) => {
|
|
128
|
+
const { query, engine, options } = props;
|
|
129
|
+
const state = useLocalObservable(
|
|
130
|
+
() => new DataCubeState(query, engine, options),
|
|
131
|
+
);
|
|
126
132
|
|
|
127
133
|
useEffect(() => {
|
|
128
134
|
state
|
|
@@ -130,12 +136,12 @@ export const DataCube = observer(
|
|
|
130
136
|
.catch((error) => state.engine.logUnhandledError(error));
|
|
131
137
|
}, [state]);
|
|
132
138
|
|
|
133
|
-
if (!state.
|
|
139
|
+
if (!state.initializeState.hasSucceeded) {
|
|
134
140
|
return <></>;
|
|
135
141
|
}
|
|
136
142
|
return (
|
|
137
143
|
<DataCubeContextProvider value={state}>
|
|
138
|
-
<DataCubeRoot />
|
|
144
|
+
<DataCubeRoot key={state.uuid} />
|
|
139
145
|
</DataCubeContextProvider>
|
|
140
146
|
);
|
|
141
147
|
},
|
|
@@ -19,11 +19,13 @@ import { noop } from '@finos/legend-shared';
|
|
|
19
19
|
import { observer } from 'mobx-react-lite';
|
|
20
20
|
import { useRef } from 'react';
|
|
21
21
|
import { useDataCube } from '../DataCubeProvider.js';
|
|
22
|
+
import { FormButton } from './DataCubeFormUtils.js';
|
|
22
23
|
|
|
23
24
|
export enum AlertType {
|
|
25
|
+
ERROR = 'ERROR',
|
|
24
26
|
INFO = 'INFO',
|
|
27
|
+
SUCCESS = 'SUCCESS',
|
|
25
28
|
WARNING = 'WARNING',
|
|
26
|
-
ERROR = 'ERROR',
|
|
27
29
|
}
|
|
28
30
|
|
|
29
31
|
export type ActionAlertAction = { label: string; handler: () => void };
|
|
@@ -56,15 +58,18 @@ export function Alert(props: {
|
|
|
56
58
|
})}
|
|
57
59
|
>
|
|
58
60
|
<div className="mr-3">
|
|
61
|
+
{type === AlertType.ERROR && (
|
|
62
|
+
<DataCubeIcon.AlertError className="flex-shrink-0 stroke-[0.5px] text-[40px] text-red-500" />
|
|
63
|
+
)}
|
|
59
64
|
{type === AlertType.INFO && (
|
|
60
65
|
<DataCubeIcon.AlertInfo className="flex-shrink-0 stroke-[0.5px] text-[40px] text-sky-500" />
|
|
61
66
|
)}
|
|
67
|
+
{type === AlertType.SUCCESS && (
|
|
68
|
+
<DataCubeIcon.AlertSuccess className="flex-shrink-0 stroke-[0.5px] text-[40px] text-green-500" />
|
|
69
|
+
)}
|
|
62
70
|
{type === AlertType.WARNING && (
|
|
63
71
|
<DataCubeIcon.AlertWarning className="flex-shrink-0 stroke-[0.3px] text-[40px] text-amber-500" />
|
|
64
72
|
)}
|
|
65
|
-
{type === AlertType.ERROR && (
|
|
66
|
-
<DataCubeIcon.AlertError className="flex-shrink-0 stroke-[0.5px] text-[40px] text-red-500" />
|
|
67
|
-
)}
|
|
68
73
|
</div>
|
|
69
74
|
<div>
|
|
70
75
|
<div className="whitespace-break-spaces text-lg">{message}</div>
|
|
@@ -76,8 +81,8 @@ export function Alert(props: {
|
|
|
76
81
|
{actions.length !== 0 && (
|
|
77
82
|
<div className="flex h-10 items-center justify-center border border-t-neutral-300 px-2">
|
|
78
83
|
{actions.map((action, idx) => (
|
|
79
|
-
<
|
|
80
|
-
className="ml-2
|
|
84
|
+
<FormButton
|
|
85
|
+
className="ml-2 first-of-type:ml-0"
|
|
81
86
|
// eslint-disable-next-line react/no-array-index-key
|
|
82
87
|
key={idx}
|
|
83
88
|
onClick={() => {
|
|
@@ -87,7 +92,7 @@ export function Alert(props: {
|
|
|
87
92
|
autoFocus={idx === 0} // UX-wise, the first action should always be the default, i.e. auto-focus on the first button
|
|
88
93
|
>
|
|
89
94
|
{action.label}
|
|
90
|
-
</
|
|
95
|
+
</FormButton>
|
|
91
96
|
))}
|
|
92
97
|
</div>
|
|
93
98
|
)}
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
+
import { type IDisposable, editor as monacoEditorAPI } from 'monaco-editor';
|
|
17
18
|
import {
|
|
18
19
|
BasePopover,
|
|
19
20
|
Checkbox,
|
|
@@ -35,6 +36,15 @@ import {
|
|
|
35
36
|
import React, { forwardRef, useEffect, useRef, useState } from 'react';
|
|
36
37
|
import { isString } from '@finos/legend-shared';
|
|
37
38
|
import { useDataCube } from '../DataCubeProvider.js';
|
|
39
|
+
import {
|
|
40
|
+
clearMarkers,
|
|
41
|
+
CODE_EDITOR_THEME,
|
|
42
|
+
getBaseCodeEditorOptions,
|
|
43
|
+
getCodeEditorValue,
|
|
44
|
+
normalizeLineEnding,
|
|
45
|
+
resetLineNumberGutterWidth,
|
|
46
|
+
setErrorMarkers,
|
|
47
|
+
} from '@finos/legend-code-editor';
|
|
38
48
|
|
|
39
49
|
export function FormBadge_WIP() {
|
|
40
50
|
return (
|
|
@@ -58,6 +68,26 @@ export function FormBadge_Advanced() {
|
|
|
58
68
|
);
|
|
59
69
|
}
|
|
60
70
|
|
|
71
|
+
export const FormButton = forwardRef<
|
|
72
|
+
HTMLButtonElement,
|
|
73
|
+
React.ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
74
|
+
compact?: boolean | undefined;
|
|
75
|
+
}
|
|
76
|
+
>(function FormButton(props, ref) {
|
|
77
|
+
const { className, compact, ...otherProps } = props;
|
|
78
|
+
return (
|
|
79
|
+
<button
|
|
80
|
+
ref={ref}
|
|
81
|
+
{...otherProps}
|
|
82
|
+
className={cn(
|
|
83
|
+
'flex h-6 min-w-20 items-center justify-center border border-neutral-400 bg-neutral-300 px-2.5 hover:brightness-95 disabled:cursor-not-allowed disabled:border-neutral-300 disabled:text-neutral-400 disabled:hover:brightness-100',
|
|
84
|
+
{ 'h-5 text-sm': Boolean(compact) },
|
|
85
|
+
className,
|
|
86
|
+
)}
|
|
87
|
+
/>
|
|
88
|
+
);
|
|
89
|
+
});
|
|
90
|
+
|
|
61
91
|
export const FormNumberInput = forwardRef(function FormNumberInput(
|
|
62
92
|
props: React.InputHTMLAttributes<HTMLInputElement> & {
|
|
63
93
|
min?: number | undefined;
|
|
@@ -451,32 +481,33 @@ function FormColorPicker(props: {
|
|
|
451
481
|
/>
|
|
452
482
|
</div>
|
|
453
483
|
<div className="flex">
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
className="ml-1 h-4 w-9 border border-neutral-400 bg-neutral-300 px-1 text-xs hover:brightness-95"
|
|
457
|
-
onClick={() => {
|
|
458
|
-
setColor(defaultColor);
|
|
459
|
-
}}
|
|
460
|
-
>
|
|
461
|
-
Reset
|
|
462
|
-
</button>
|
|
463
|
-
)}
|
|
464
|
-
<button
|
|
465
|
-
className="ml-1 h-4 w-9 border border-neutral-400 bg-neutral-300 px-1 text-xs hover:brightness-95"
|
|
484
|
+
<FormButton
|
|
485
|
+
className="h-4 w-9"
|
|
466
486
|
onClick={() => {
|
|
467
487
|
onClose();
|
|
468
488
|
}}
|
|
469
489
|
>
|
|
470
490
|
Cancel
|
|
471
|
-
</
|
|
472
|
-
<
|
|
473
|
-
className="ml-1 h-4 w-9
|
|
491
|
+
</FormButton>
|
|
492
|
+
<FormButton
|
|
493
|
+
className="ml-1 h-4 w-9 text-xs"
|
|
494
|
+
disabled={defaultColor === undefined}
|
|
495
|
+
onClick={() => {
|
|
496
|
+
if (defaultColor !== undefined) {
|
|
497
|
+
setColor(defaultColor);
|
|
498
|
+
}
|
|
499
|
+
}}
|
|
500
|
+
>
|
|
501
|
+
Reset
|
|
502
|
+
</FormButton>
|
|
503
|
+
<FormButton
|
|
504
|
+
className="ml-1 h-4 w-9"
|
|
474
505
|
onClick={() => {
|
|
475
506
|
submit();
|
|
476
507
|
}}
|
|
477
508
|
>
|
|
478
509
|
OK
|
|
479
|
-
</
|
|
510
|
+
</FormButton>
|
|
480
511
|
</div>
|
|
481
512
|
</div>
|
|
482
513
|
</div>
|
|
@@ -575,3 +606,201 @@ export const FormDocumentation: React.FC<{
|
|
|
575
606
|
</div>
|
|
576
607
|
);
|
|
577
608
|
};
|
|
609
|
+
|
|
610
|
+
export const FormCodeEditor: React.FC<{
|
|
611
|
+
value: string;
|
|
612
|
+
updateValue?: ((val: string) => void) | undefined;
|
|
613
|
+
language: string;
|
|
614
|
+
title?: string | undefined;
|
|
615
|
+
isReadOnly?: boolean | undefined;
|
|
616
|
+
hideMinimap?: boolean | undefined;
|
|
617
|
+
hideGutter?: boolean | undefined;
|
|
618
|
+
hidePadding?: boolean | undefined;
|
|
619
|
+
hideActionBar?: boolean | undefined;
|
|
620
|
+
lineToScroll?: number | undefined;
|
|
621
|
+
extraEditorOptions?:
|
|
622
|
+
| (monacoEditorAPI.IEditorOptions & monacoEditorAPI.IGlobalEditorOptions)
|
|
623
|
+
| undefined;
|
|
624
|
+
error?:
|
|
625
|
+
| {
|
|
626
|
+
message: string;
|
|
627
|
+
sourceInformation: {
|
|
628
|
+
startLine: number;
|
|
629
|
+
startColumn: number;
|
|
630
|
+
endLine: number;
|
|
631
|
+
endColumn: number;
|
|
632
|
+
};
|
|
633
|
+
}
|
|
634
|
+
| undefined;
|
|
635
|
+
}> = (props) => {
|
|
636
|
+
const {
|
|
637
|
+
value: inputValue,
|
|
638
|
+
updateValue,
|
|
639
|
+
language,
|
|
640
|
+
title,
|
|
641
|
+
isReadOnly,
|
|
642
|
+
hideMinimap,
|
|
643
|
+
hideGutter,
|
|
644
|
+
hidePadding,
|
|
645
|
+
hideActionBar,
|
|
646
|
+
lineToScroll,
|
|
647
|
+
extraEditorOptions,
|
|
648
|
+
error,
|
|
649
|
+
} = props;
|
|
650
|
+
const [editor, setEditor] = useState<
|
|
651
|
+
monacoEditorAPI.IStandaloneCodeEditor | undefined
|
|
652
|
+
>();
|
|
653
|
+
const [isWordWrap, setIsWordWrap] = useState(false);
|
|
654
|
+
const onDidChangeModelContentEventDisposer = useRef<IDisposable | undefined>(
|
|
655
|
+
undefined,
|
|
656
|
+
);
|
|
657
|
+
|
|
658
|
+
/**
|
|
659
|
+
* NOTE: we want to normalize line ending here since if the original
|
|
660
|
+
* input value includes CR '\r' character, it will get normalized, calling
|
|
661
|
+
* the updateValue method and cause a rerender. With the way we setup
|
|
662
|
+
* `onChange` method, React will warn about `setState` being called in
|
|
663
|
+
* `render` method.
|
|
664
|
+
* See https://github.com/finos/legend-studio/issues/608
|
|
665
|
+
*/
|
|
666
|
+
const value = normalizeLineEnding(inputValue);
|
|
667
|
+
const ref = useRef<HTMLDivElement>(null);
|
|
668
|
+
|
|
669
|
+
const toggleWordWrap = (): void => {
|
|
670
|
+
const updatedWordWrap = !isWordWrap;
|
|
671
|
+
setIsWordWrap(updatedWordWrap);
|
|
672
|
+
editor?.updateOptions({
|
|
673
|
+
wordWrap: updatedWordWrap ? 'on' : 'off',
|
|
674
|
+
});
|
|
675
|
+
};
|
|
676
|
+
|
|
677
|
+
useEffect(() => {
|
|
678
|
+
if (!editor && ref.current) {
|
|
679
|
+
const element = ref.current;
|
|
680
|
+
const _editor = monacoEditorAPI.create(element, {
|
|
681
|
+
...getBaseCodeEditorOptions(),
|
|
682
|
+
fontSize: 12,
|
|
683
|
+
theme: CODE_EDITOR_THEME.GITHUB_LIGHT,
|
|
684
|
+
// layout
|
|
685
|
+
glyphMargin: !hidePadding,
|
|
686
|
+
padding: !hidePadding ? { top: 20, bottom: 20 } : { top: 0, bottom: 0 },
|
|
687
|
+
|
|
688
|
+
formatOnType: true,
|
|
689
|
+
formatOnPaste: true,
|
|
690
|
+
});
|
|
691
|
+
setEditor(_editor);
|
|
692
|
+
}
|
|
693
|
+
}, [hidePadding, editor]);
|
|
694
|
+
|
|
695
|
+
useEffect(() => {
|
|
696
|
+
if (editor) {
|
|
697
|
+
resetLineNumberGutterWidth(editor);
|
|
698
|
+
const model = editor.getModel();
|
|
699
|
+
if (model) {
|
|
700
|
+
monacoEditorAPI.setModelLanguage(model, language);
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
}, [editor, language]);
|
|
704
|
+
|
|
705
|
+
useEffect(() => {
|
|
706
|
+
if (editor && lineToScroll !== undefined) {
|
|
707
|
+
editor.revealLineInCenter(lineToScroll);
|
|
708
|
+
}
|
|
709
|
+
}, [editor, lineToScroll]);
|
|
710
|
+
|
|
711
|
+
if (editor) {
|
|
712
|
+
// dispose the old editor content setter in case the `updateValue` handler changes
|
|
713
|
+
// for a more extensive note on this, see `LambdaEditor`
|
|
714
|
+
onDidChangeModelContentEventDisposer.current?.dispose();
|
|
715
|
+
onDidChangeModelContentEventDisposer.current =
|
|
716
|
+
editor.onDidChangeModelContent(() => {
|
|
717
|
+
const currentVal = getCodeEditorValue(editor);
|
|
718
|
+
if (currentVal !== value) {
|
|
719
|
+
updateValue?.(currentVal);
|
|
720
|
+
}
|
|
721
|
+
});
|
|
722
|
+
|
|
723
|
+
// Set the text value and editor options
|
|
724
|
+
const currentValue = getCodeEditorValue(editor);
|
|
725
|
+
if (currentValue !== value) {
|
|
726
|
+
editor.setValue(value);
|
|
727
|
+
}
|
|
728
|
+
editor.updateOptions({
|
|
729
|
+
readOnly: Boolean(isReadOnly),
|
|
730
|
+
minimap: { enabled: !hideMinimap },
|
|
731
|
+
// Hide the line number gutter
|
|
732
|
+
// See https://github.com/microsoft/vscode/issues/30795
|
|
733
|
+
...(hideGutter
|
|
734
|
+
? {
|
|
735
|
+
glyphMargin: !hidePadding,
|
|
736
|
+
folding: false,
|
|
737
|
+
lineNumbers: 'off',
|
|
738
|
+
lineDecorationsWidth: 0,
|
|
739
|
+
}
|
|
740
|
+
: {}),
|
|
741
|
+
...(extraEditorOptions ?? {}),
|
|
742
|
+
});
|
|
743
|
+
const model = editor.getModel();
|
|
744
|
+
if (model) {
|
|
745
|
+
if (error?.sourceInformation) {
|
|
746
|
+
setErrorMarkers(model, [
|
|
747
|
+
{
|
|
748
|
+
message: error.message,
|
|
749
|
+
startLineNumber: error.sourceInformation.startLine,
|
|
750
|
+
startColumn: error.sourceInformation.startColumn,
|
|
751
|
+
endLineNumber: error.sourceInformation.endLine,
|
|
752
|
+
endColumn: error.sourceInformation.endColumn,
|
|
753
|
+
},
|
|
754
|
+
]);
|
|
755
|
+
} else {
|
|
756
|
+
clearMarkers();
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
// dispose editor
|
|
762
|
+
useEffect(
|
|
763
|
+
() => () => {
|
|
764
|
+
if (editor) {
|
|
765
|
+
editor.dispose();
|
|
766
|
+
|
|
767
|
+
onDidChangeModelContentEventDisposer.current?.dispose();
|
|
768
|
+
}
|
|
769
|
+
},
|
|
770
|
+
[editor],
|
|
771
|
+
);
|
|
772
|
+
|
|
773
|
+
return (
|
|
774
|
+
<div className="h-full w-full border border-neutral-200">
|
|
775
|
+
{!hideActionBar && (
|
|
776
|
+
<div className="flex h-5 w-full items-center justify-between border-b border-neutral-200">
|
|
777
|
+
<div className="pl-1 text-sm text-neutral-500">{title ?? ''}</div>
|
|
778
|
+
<button
|
|
779
|
+
tabIndex={-1}
|
|
780
|
+
className={cn(
|
|
781
|
+
'flex aspect-square h-5 items-center justify-center text-neutral-300 hover:text-neutral-600',
|
|
782
|
+
{
|
|
783
|
+
'text-neutral-600': isWordWrap,
|
|
784
|
+
},
|
|
785
|
+
)}
|
|
786
|
+
onClick={toggleWordWrap}
|
|
787
|
+
title={`[${isWordWrap ? 'on' : 'off'}] Toggle word wrap`}
|
|
788
|
+
>
|
|
789
|
+
<DataCubeIcon.WordWrap />
|
|
790
|
+
</button>
|
|
791
|
+
</div>
|
|
792
|
+
)}
|
|
793
|
+
<div
|
|
794
|
+
className={cn('relative h-full w-full', {
|
|
795
|
+
'code-editor__content--padding': !hidePadding,
|
|
796
|
+
'h-[calc(100%_-_20px)]': !hideActionBar,
|
|
797
|
+
})}
|
|
798
|
+
>
|
|
799
|
+
<div
|
|
800
|
+
className="absolute left-0 top-0 h-full w-full overflow-hidden"
|
|
801
|
+
ref={ref}
|
|
802
|
+
/>
|
|
803
|
+
</div>
|
|
804
|
+
</div>
|
|
805
|
+
);
|
|
806
|
+
};
|
|
@@ -163,7 +163,7 @@ export const Window = (props: {
|
|
|
163
163
|
<DataCubeIcon.X />
|
|
164
164
|
</button>
|
|
165
165
|
</div>
|
|
166
|
-
<div className="h-[calc(100%_-_24px)] w-full">
|
|
166
|
+
<div className="h-[calc(100%_-_24px)] w-full overflow-auto">
|
|
167
167
|
{windowState.configuration.contentRenderer(windowState.configuration)}
|
|
168
168
|
</div>
|
|
169
169
|
</div>
|