@finos/legend-application-studio 27.1.0 → 27.1.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/lib/__lib__/LegendStudioEvent.d.ts +1 -0
- package/lib/__lib__/LegendStudioEvent.d.ts.map +1 -1
- package/lib/__lib__/LegendStudioEvent.js +1 -0
- package/lib/__lib__/LegendStudioEvent.js.map +1 -1
- package/lib/components/editor/editor-group/FunctionEditor.d.ts.map +1 -1
- package/lib/components/editor/editor-group/FunctionEditor.js +28 -24
- package/lib/components/editor/editor-group/FunctionEditor.js.map +1 -1
- package/lib/components/editor/editor-group/connection-editor/{DatabaseBuilder.d.ts → DatabaseBuilderWizard.d.ts} +4 -11
- package/lib/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.d.ts.map +1 -0
- package/lib/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.js +48 -0
- package/lib/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.js.map +1 -0
- package/lib/components/editor/editor-group/connection-editor/DatabaseSchemaExplorer.d.ts +32 -0
- package/lib/components/editor/editor-group/connection-editor/DatabaseSchemaExplorer.d.ts.map +1 -0
- package/lib/components/editor/editor-group/connection-editor/DatabaseSchemaExplorer.js +99 -0
- package/lib/components/editor/editor-group/connection-editor/DatabaseSchemaExplorer.js.map +1 -0
- package/lib/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.js +1 -1
- package/lib/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.js.map +1 -1
- package/lib/components/editor/editor-group/data-editor/EmbeddedDataEditor.d.ts.map +1 -1
- package/lib/components/editor/editor-group/data-editor/EmbeddedDataEditor.js +5 -4
- package/lib/components/editor/editor-group/data-editor/EmbeddedDataEditor.js.map +1 -1
- package/lib/components/editor/editor-group/data-editor/RelationalCSVDataEditor.d.ts.map +1 -1
- package/lib/components/editor/editor-group/data-editor/RelationalCSVDataEditor.js +62 -12
- package/lib/components/editor/editor-group/data-editor/RelationalCSVDataEditor.js.map +1 -1
- package/lib/components/editor/editor-group/mapping-editor/MappingTestableEditor.d.ts +1 -1
- package/lib/components/editor/editor-group/mapping-editor/MappingTestableEditor.d.ts.map +1 -1
- package/lib/components/editor/editor-group/mapping-editor/MappingTestableEditor.js +101 -137
- package/lib/components/editor/editor-group/mapping-editor/MappingTestableEditor.js.map +1 -1
- package/lib/components/editor/editor-group/testable/TestableSharedComponents.d.ts +11 -0
- package/lib/components/editor/editor-group/testable/TestableSharedComponents.d.ts.map +1 -1
- package/lib/components/editor/editor-group/testable/TestableSharedComponents.js +27 -2
- package/lib/components/editor/editor-group/testable/TestableSharedComponents.js.map +1 -1
- package/lib/components/editor/panel-group/SQLPlaygroundPanel.d.ts +0 -7
- package/lib/components/editor/panel-group/SQLPlaygroundPanel.d.ts.map +1 -1
- package/lib/components/editor/panel-group/SQLPlaygroundPanel.js +20 -77
- package/lib/components/editor/panel-group/SQLPlaygroundPanel.js.map +1 -1
- package/lib/components/editor/side-bar/Explorer.js +3 -3
- package/lib/components/editor/side-bar/Explorer.js.map +1 -1
- package/lib/components/editor/side-bar/WorkflowManager.d.ts.map +1 -1
- package/lib/components/editor/side-bar/WorkflowManager.js +6 -1
- package/lib/components/editor/side-bar/WorkflowManager.js.map +1 -1
- package/lib/index.css +2 -2
- package/lib/index.css.map +1 -1
- package/lib/package.json +3 -3
- package/lib/stores/editor/ExplorerTreeState.d.ts +4 -4
- package/lib/stores/editor/ExplorerTreeState.d.ts.map +1 -1
- package/lib/stores/editor/ExplorerTreeState.js +4 -4
- package/lib/stores/editor/ExplorerTreeState.js.map +1 -1
- package/lib/stores/editor/NewElementState.d.ts.map +1 -1
- package/lib/stores/editor/NewElementState.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/FunctionEditorState.d.ts +12 -12
- package/lib/stores/editor/editor-state/element-editor-state/FunctionEditorState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/FunctionEditorState.js +45 -46
- package/lib/stores/editor/editor-state/element-editor-state/FunctionEditorState.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.d.ts +20 -29
- package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.js +60 -141
- package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.d.ts +33 -0
- package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.d.ts.map +1 -0
- package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.js +71 -0
- package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.js.map +1 -0
- package/lib/stores/editor/editor-state/element-editor-state/data/DataEditorState.d.ts +2 -2
- package/lib/stores/editor/editor-state/element-editor-state/data/DataEditorState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/data/DataEditorState.js +2 -2
- package/lib/stores/editor/editor-state/element-editor-state/data/DataEditorState.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/data/EmbeddedDataState.d.ts +14 -19
- package/lib/stores/editor/editor-state/element-editor-state/data/EmbeddedDataState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/data/EmbeddedDataState.js +30 -65
- package/lib/stores/editor/editor-state/element-editor-state/data/EmbeddedDataState.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.d.ts +56 -78
- package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.js +285 -384
- package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestingHelper.d.ts +23 -0
- package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestingHelper.d.ts.map +1 -0
- package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestingHelper.js +129 -0
- package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestingHelper.js.map +1 -0
- package/lib/stores/editor/editor-state/element-editor-state/service/ServiceEditorState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/service/ServiceEditorState.js +2 -2
- package/lib/stores/editor/editor-state/element-editor-state/service/ServiceEditorState.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestDataState.d.ts +1 -0
- package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestDataState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestDataState.js +12 -2
- package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestDataState.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestableState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestableState.js +15 -8
- package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestableState.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.d.ts +7 -4
- package/lib/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.js +53 -10
- package/lib/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/testable/TestableEditorState.d.ts +2 -1
- package/lib/stores/editor/editor-state/element-editor-state/testable/TestableEditorState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/testable/TestableEditorState.js +20 -16
- package/lib/stores/editor/editor-state/element-editor-state/testable/TestableEditorState.js.map +1 -1
- package/lib/stores/editor/panel-group/SQLPlaygroundPanelState.d.ts +3 -48
- package/lib/stores/editor/panel-group/SQLPlaygroundPanelState.d.ts.map +1 -1
- package/lib/stores/editor/panel-group/SQLPlaygroundPanelState.js +12 -350
- package/lib/stores/editor/panel-group/SQLPlaygroundPanelState.js.map +1 -1
- package/lib/stores/editor/sidebar-state/WorkflowManagerState.d.ts +5 -0
- package/lib/stores/editor/sidebar-state/WorkflowManagerState.d.ts.map +1 -1
- package/lib/stores/editor/sidebar-state/WorkflowManagerState.js +26 -0
- package/lib/stores/editor/sidebar-state/WorkflowManagerState.js.map +1 -1
- package/lib/stores/editor/sidebar-state/testable/GlobalTestRunnerState.d.ts +1 -1
- package/lib/stores/editor/sidebar-state/testable/GlobalTestRunnerState.d.ts.map +1 -1
- package/lib/stores/editor/sidebar-state/testable/GlobalTestRunnerState.js +3 -0
- package/lib/stores/editor/sidebar-state/testable/GlobalTestRunnerState.js.map +1 -1
- package/lib/stores/editor/utils/MockDataUtils.d.ts.map +1 -1
- package/lib/stores/editor/utils/MockDataUtils.js +3 -0
- package/lib/stores/editor/utils/MockDataUtils.js.map +1 -1
- package/lib/stores/editor/utils/TestableUtils.d.ts +11 -1
- package/lib/stores/editor/utils/TestableUtils.d.ts.map +1 -1
- package/lib/stores/editor/utils/TestableUtils.js +50 -1
- package/lib/stores/editor/utils/TestableUtils.js.map +1 -1
- package/lib/stores/graph-modifier/DSL_Mapping_GraphModifierHelper.d.ts +5 -4
- package/lib/stores/graph-modifier/DSL_Mapping_GraphModifierHelper.d.ts.map +1 -1
- package/lib/stores/graph-modifier/DSL_Mapping_GraphModifierHelper.js +4 -1
- package/lib/stores/graph-modifier/DSL_Mapping_GraphModifierHelper.js.map +1 -1
- package/package.json +9 -9
- package/src/__lib__/LegendStudioEvent.ts +1 -1
- package/src/components/editor/editor-group/FunctionEditor.tsx +133 -118
- package/src/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.tsx +191 -0
- package/src/components/editor/editor-group/connection-editor/DatabaseSchemaExplorer.tsx +227 -0
- package/src/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.tsx +1 -1
- package/src/components/editor/editor-group/data-editor/EmbeddedDataEditor.tsx +34 -37
- package/src/components/editor/editor-group/data-editor/RelationalCSVDataEditor.tsx +134 -31
- package/src/components/editor/editor-group/mapping-editor/MappingTestableEditor.tsx +296 -414
- package/src/components/editor/editor-group/testable/TestableSharedComponents.tsx +88 -3
- package/src/components/editor/panel-group/SQLPlaygroundPanel.tsx +47 -211
- package/src/components/editor/side-bar/Explorer.tsx +3 -3
- package/src/components/editor/side-bar/WorkflowManager.tsx +10 -0
- package/src/stores/editor/ExplorerTreeState.ts +6 -9
- package/src/stores/editor/NewElementState.ts +0 -1
- package/src/stores/editor/editor-state/element-editor-state/FunctionEditorState.ts +44 -50
- package/src/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.ts +88 -212
- package/src/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.ts +102 -0
- package/src/stores/editor/editor-state/element-editor-state/data/DataEditorState.ts +7 -1
- package/src/stores/editor/editor-state/element-editor-state/data/EmbeddedDataState.ts +48 -77
- package/src/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.ts +407 -617
- package/src/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestingHelper.ts +243 -0
- package/src/stores/editor/editor-state/element-editor-state/service/ServiceEditorState.ts +6 -2
- package/src/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestDataState.ts +18 -1
- package/src/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestableState.ts +20 -12
- package/src/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.ts +76 -18
- package/src/stores/editor/editor-state/element-editor-state/testable/TestableEditorState.ts +29 -24
- package/src/stores/editor/panel-group/SQLPlaygroundPanelState.ts +13 -533
- package/src/stores/editor/sidebar-state/WorkflowManagerState.ts +47 -0
- package/src/stores/editor/sidebar-state/testable/GlobalTestRunnerState.ts +4 -1
- package/src/stores/editor/utils/MockDataUtils.ts +2 -0
- package/src/stores/editor/utils/TestableUtils.ts +73 -0
- package/src/stores/graph-modifier/DSL_Mapping_GraphModifierHelper.ts +15 -12
- package/tsconfig.json +4 -1
- package/lib/components/editor/editor-group/connection-editor/DatabaseBuilder.d.ts.map +0 -1
- package/lib/components/editor/editor-group/connection-editor/DatabaseBuilder.js +0 -133
- package/lib/components/editor/editor-group/connection-editor/DatabaseBuilder.js.map +0 -1
- package/src/components/editor/editor-group/connection-editor/DatabaseBuilder.tsx +0 -397
@@ -0,0 +1,227 @@
|
|
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 {
|
19
|
+
type TreeNodeContainerProps,
|
20
|
+
TreeView,
|
21
|
+
PURE_DatabaseSchemaIcon,
|
22
|
+
PURE_DatabaseTableIcon,
|
23
|
+
CircleIcon,
|
24
|
+
ChevronDownIcon,
|
25
|
+
ChevronRightIcon,
|
26
|
+
CheckCircleIcon,
|
27
|
+
EmptyCircleIcon,
|
28
|
+
KeyIcon,
|
29
|
+
} from '@finos/legend-art';
|
30
|
+
import {
|
31
|
+
type DatabaseExplorerTreeData,
|
32
|
+
type DatabaseSchemaExplorerTreeNodeData,
|
33
|
+
DatabaseSchemaExplorerTreeColumnNodeData,
|
34
|
+
DatabaseSchemaExplorerTreeSchemaNodeData,
|
35
|
+
DatabaseSchemaExplorerTreeTableNodeData,
|
36
|
+
type DatabaseSchemaExplorerState,
|
37
|
+
} from '../../../../stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.js';
|
38
|
+
import { useApplicationStore } from '@finos/legend-application';
|
39
|
+
import { renderColumnTypeIcon } from './DatabaseEditorHelper.js';
|
40
|
+
import { flowResult } from 'mobx';
|
41
|
+
import { stringifyDataType } from '@finos/legend-graph';
|
42
|
+
import { forwardRef } from 'react';
|
43
|
+
|
44
|
+
const getDatabaseSchemaNodeIcon = (
|
45
|
+
node: DatabaseSchemaExplorerTreeNodeData,
|
46
|
+
): React.ReactNode => {
|
47
|
+
if (node instanceof DatabaseSchemaExplorerTreeSchemaNodeData) {
|
48
|
+
return (
|
49
|
+
<div className="database-schema-explorer__icon--schema">
|
50
|
+
<PURE_DatabaseSchemaIcon />
|
51
|
+
</div>
|
52
|
+
);
|
53
|
+
} else if (node instanceof DatabaseSchemaExplorerTreeTableNodeData) {
|
54
|
+
return (
|
55
|
+
<div className="database-schema-explorer__icon--table">
|
56
|
+
<PURE_DatabaseTableIcon />
|
57
|
+
</div>
|
58
|
+
);
|
59
|
+
} else if (node instanceof DatabaseSchemaExplorerTreeColumnNodeData) {
|
60
|
+
return renderColumnTypeIcon(node.column.type);
|
61
|
+
}
|
62
|
+
return null;
|
63
|
+
};
|
64
|
+
|
65
|
+
export type DatabaseSchemaExplorerTreeNodeContainerProps =
|
66
|
+
TreeNodeContainerProps<
|
67
|
+
DatabaseSchemaExplorerTreeNodeData,
|
68
|
+
{
|
69
|
+
toggleCheckedNode: (node: DatabaseSchemaExplorerTreeNodeData) => void;
|
70
|
+
isPartiallySelected: (
|
71
|
+
node: DatabaseSchemaExplorerTreeNodeData,
|
72
|
+
) => boolean;
|
73
|
+
}
|
74
|
+
>;
|
75
|
+
|
76
|
+
export const DatabaseSchemaExplorerTreeNodeContainer = observer(
|
77
|
+
forwardRef<HTMLDivElement, DatabaseSchemaExplorerTreeNodeContainerProps>(
|
78
|
+
function DatabaseSchemaExplorerTreeNodeContainer(props, ref) {
|
79
|
+
const { node, level, stepPaddingInRem, onNodeSelect, innerProps } = props;
|
80
|
+
const { toggleCheckedNode, isPartiallySelected } = innerProps;
|
81
|
+
const isExpandable =
|
82
|
+
Boolean(!node.childrenIds || node.childrenIds.length) &&
|
83
|
+
!(node instanceof DatabaseSchemaExplorerTreeColumnNodeData);
|
84
|
+
const nodeExpandIcon = isExpandable ? (
|
85
|
+
node.isOpen ? (
|
86
|
+
<ChevronDownIcon />
|
87
|
+
) : (
|
88
|
+
<ChevronRightIcon />
|
89
|
+
)
|
90
|
+
) : (
|
91
|
+
<div />
|
92
|
+
);
|
93
|
+
const nodeTypeIcon = getDatabaseSchemaNodeIcon(node);
|
94
|
+
const toggleExpandNode = (): void => {
|
95
|
+
onNodeSelect?.(node);
|
96
|
+
if (!isExpandable) {
|
97
|
+
toggleCheckedNode(node);
|
98
|
+
}
|
99
|
+
};
|
100
|
+
const isPrimaryKeyColumn =
|
101
|
+
node instanceof DatabaseSchemaExplorerTreeColumnNodeData &&
|
102
|
+
node.owner.primaryKey.includes(node.column);
|
103
|
+
|
104
|
+
const renderCheckedIcon = (
|
105
|
+
_node: DatabaseSchemaExplorerTreeNodeData,
|
106
|
+
): React.ReactNode => {
|
107
|
+
if (_node instanceof DatabaseSchemaExplorerTreeColumnNodeData) {
|
108
|
+
return null;
|
109
|
+
} else if (isPartiallySelected(_node)) {
|
110
|
+
return <CircleIcon />;
|
111
|
+
} else if (_node.isChecked) {
|
112
|
+
return <CheckCircleIcon />;
|
113
|
+
}
|
114
|
+
return <EmptyCircleIcon />;
|
115
|
+
};
|
116
|
+
|
117
|
+
return (
|
118
|
+
<div
|
119
|
+
className="tree-view__node__container"
|
120
|
+
ref={ref}
|
121
|
+
style={{
|
122
|
+
paddingLeft: `${level * (stepPaddingInRem ?? 1)}rem`,
|
123
|
+
display: 'flex',
|
124
|
+
}}
|
125
|
+
onClick={toggleExpandNode}
|
126
|
+
>
|
127
|
+
<div className="tree-view__node__icon database-schema-explorer__node__icon__group">
|
128
|
+
<div className="database-schema-explorer__expand-icon">
|
129
|
+
{nodeExpandIcon}
|
130
|
+
</div>
|
131
|
+
<div
|
132
|
+
className="database-schema-explorer__checker-icon"
|
133
|
+
onClick={(event) => {
|
134
|
+
event.stopPropagation();
|
135
|
+
toggleCheckedNode(node);
|
136
|
+
}}
|
137
|
+
>
|
138
|
+
{renderCheckedIcon(node)}
|
139
|
+
</div>
|
140
|
+
<div className="database-schema-explorer__type-icon">
|
141
|
+
{nodeTypeIcon}
|
142
|
+
</div>
|
143
|
+
</div>
|
144
|
+
<div className="tree-view__node__label database-schema-explorer__node__label">
|
145
|
+
{node.label}
|
146
|
+
{node instanceof DatabaseSchemaExplorerTreeColumnNodeData && (
|
147
|
+
<div className="database-schema-explorer__node__type">
|
148
|
+
<div className="database-schema-explorer__node__type__label">
|
149
|
+
{stringifyDataType(node.column.type)}
|
150
|
+
</div>
|
151
|
+
</div>
|
152
|
+
)}
|
153
|
+
{isPrimaryKeyColumn && (
|
154
|
+
<div
|
155
|
+
className="database-schema-explorer__node__pk"
|
156
|
+
title="Primary Key"
|
157
|
+
>
|
158
|
+
<KeyIcon />
|
159
|
+
</div>
|
160
|
+
)}
|
161
|
+
</div>
|
162
|
+
</div>
|
163
|
+
);
|
164
|
+
},
|
165
|
+
),
|
166
|
+
);
|
167
|
+
|
168
|
+
export const DatabaseSchemaExplorer = observer(
|
169
|
+
(props: {
|
170
|
+
schemaExplorerState: DatabaseSchemaExplorerState;
|
171
|
+
treeData: DatabaseExplorerTreeData;
|
172
|
+
isReadOnly?: boolean | undefined;
|
173
|
+
treeNodeContainerComponent?:
|
174
|
+
| React.FC<DatabaseSchemaExplorerTreeNodeContainerProps>
|
175
|
+
| undefined;
|
176
|
+
}) => {
|
177
|
+
const { treeData, schemaExplorerState, treeNodeContainerComponent } = props;
|
178
|
+
const applicationStore = useApplicationStore();
|
179
|
+
const onNodeSelect = (node: DatabaseSchemaExplorerTreeNodeData): void => {
|
180
|
+
flowResult(schemaExplorerState.onNodeSelect(node, treeData)).catch(
|
181
|
+
applicationStore.alertUnhandledError,
|
182
|
+
);
|
183
|
+
};
|
184
|
+
const getChildNodes = (
|
185
|
+
node: DatabaseSchemaExplorerTreeNodeData,
|
186
|
+
): DatabaseSchemaExplorerTreeNodeData[] =>
|
187
|
+
schemaExplorerState
|
188
|
+
.getChildNodes(node, treeData)
|
189
|
+
?.sort((a, b) => a.label.localeCompare(b.label)) ?? [];
|
190
|
+
const isPartiallySelected = (
|
191
|
+
node: DatabaseSchemaExplorerTreeNodeData,
|
192
|
+
): boolean => {
|
193
|
+
if (
|
194
|
+
node instanceof DatabaseSchemaExplorerTreeSchemaNodeData &&
|
195
|
+
!node.isChecked
|
196
|
+
) {
|
197
|
+
return Boolean(
|
198
|
+
schemaExplorerState
|
199
|
+
.getChildNodes(node, treeData)
|
200
|
+
?.find((childNode) => childNode.isChecked === true),
|
201
|
+
);
|
202
|
+
}
|
203
|
+
return false;
|
204
|
+
};
|
205
|
+
const toggleCheckedNode = (
|
206
|
+
node: DatabaseSchemaExplorerTreeNodeData,
|
207
|
+
): void => schemaExplorerState.toggleCheckedNode(node, treeData);
|
208
|
+
|
209
|
+
return (
|
210
|
+
<TreeView
|
211
|
+
className="database-schema-explorer"
|
212
|
+
components={{
|
213
|
+
TreeNodeContainer:
|
214
|
+
treeNodeContainerComponent ??
|
215
|
+
DatabaseSchemaExplorerTreeNodeContainer,
|
216
|
+
}}
|
217
|
+
innerProps={{
|
218
|
+
toggleCheckedNode,
|
219
|
+
isPartiallySelected,
|
220
|
+
}}
|
221
|
+
treeData={treeData}
|
222
|
+
onNodeSelect={onNodeSelect}
|
223
|
+
getChildNodes={getChildNodes}
|
224
|
+
/>
|
225
|
+
);
|
226
|
+
},
|
227
|
+
);
|
package/src/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.tsx
CHANGED
@@ -1109,7 +1109,7 @@ const RelationalConnectionStoreEditor = observer(
|
|
1109
1109
|
}
|
1110
1110
|
};
|
1111
1111
|
const openDatabaseBuilder = (): void =>
|
1112
|
-
connectionValueState.editorStore.explorerTreeState.
|
1112
|
+
connectionValueState.editorStore.explorerTreeState.buildDatabase(
|
1113
1113
|
connection,
|
1114
1114
|
isReadOnly,
|
1115
1115
|
);
|
@@ -152,16 +152,14 @@ export const ExternalFormatDataEditor = observer(
|
|
152
152
|
</DropdownMenu>
|
153
153
|
</div>
|
154
154
|
</div>
|
155
|
-
<
|
156
|
-
<
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
</div>
|
164
|
-
</div>
|
155
|
+
<PanelContent className="model-loader__editor">
|
156
|
+
<CodeEditor
|
157
|
+
language={language}
|
158
|
+
inputValue={externalFormatDataState.embeddedData.data}
|
159
|
+
updateInput={changeData}
|
160
|
+
hideGutter={true}
|
161
|
+
/>
|
162
|
+
</PanelContent>
|
165
163
|
</div>
|
166
164
|
);
|
167
165
|
},
|
@@ -248,6 +246,7 @@ export const ModelEmbeddedDataEditor = observer(
|
|
248
246
|
}) => {
|
249
247
|
const { isReadOnly, modelStoreDataState, modelDataState } = props;
|
250
248
|
const modelData = modelDataState.modelData;
|
249
|
+
const hideClass = modelStoreDataState.hideClass;
|
251
250
|
const classSelectorRef = useRef<SelectComponent>(null);
|
252
251
|
const elementFilterOption = createFilter({
|
253
252
|
ignoreCase: true,
|
@@ -279,34 +278,32 @@ export const ModelEmbeddedDataEditor = observer(
|
|
279
278
|
};
|
280
279
|
|
281
280
|
return (
|
282
|
-
|
283
|
-
|
284
|
-
<div
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
281
|
+
<>
|
282
|
+
{!hideClass && (
|
283
|
+
<div className="sample-data-generator__controller">
|
284
|
+
<div
|
285
|
+
className="sample-data-generator__controller__icon"
|
286
|
+
title="class"
|
287
|
+
>
|
288
|
+
<PURE_ClassIcon />
|
289
|
+
</div>
|
290
|
+
<CustomSelectorInput
|
291
|
+
ref={classSelectorRef}
|
292
|
+
className="sample-data-generator__controller__class-selector"
|
293
|
+
options={classOptions}
|
294
|
+
onChange={changeClass}
|
295
|
+
value={selectedClassOption}
|
296
|
+
darkMode={true}
|
297
|
+
filterOption={elementFilterOption}
|
298
|
+
formatOptionLabel={getPackageableElementOptionFormatter({
|
299
|
+
darkMode: true,
|
300
|
+
})}
|
301
|
+
/>
|
289
302
|
</div>
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
onChange={changeClass}
|
295
|
-
value={selectedClassOption}
|
296
|
-
darkMode={true}
|
297
|
-
filterOption={elementFilterOption}
|
298
|
-
formatOptionLabel={getPackageableElementOptionFormatter({
|
299
|
-
darkMode: true,
|
300
|
-
})}
|
301
|
-
/>
|
302
|
-
</div>
|
303
|
-
<div>
|
304
|
-
{renderEmbeddedDataEditor(
|
305
|
-
modelDataState.embeddedDataState,
|
306
|
-
isReadOnly,
|
307
|
-
)}
|
308
|
-
</div>
|
309
|
-
</div>
|
303
|
+
)}
|
304
|
+
|
305
|
+
{renderEmbeddedDataEditor(modelDataState.embeddedDataState, isReadOnly)}
|
306
|
+
</>
|
310
307
|
);
|
311
308
|
},
|
312
309
|
);
|
@@ -18,6 +18,7 @@ import {
|
|
18
18
|
BlankPanelPlaceholder,
|
19
19
|
clsx,
|
20
20
|
ContextMenu,
|
21
|
+
CustomSelectorInput,
|
21
22
|
Dialog,
|
22
23
|
MenuContent,
|
23
24
|
MenuContentItem,
|
@@ -26,6 +27,7 @@ import {
|
|
26
27
|
ModalFooter,
|
27
28
|
ModalFooterButton,
|
28
29
|
ModalHeader,
|
30
|
+
PanelFormBooleanField,
|
29
31
|
PlusIcon,
|
30
32
|
ResizablePanel,
|
31
33
|
ResizablePanelGroup,
|
@@ -33,7 +35,11 @@ import {
|
|
33
35
|
ResizablePanelSplitterLine,
|
34
36
|
UploadIcon,
|
35
37
|
} from '@finos/legend-art';
|
36
|
-
import
|
38
|
+
import {
|
39
|
+
type Table,
|
40
|
+
getAllTablesFromDatabase,
|
41
|
+
RelationalCSVDataTable,
|
42
|
+
} from '@finos/legend-graph';
|
37
43
|
import { observer } from 'mobx-react-lite';
|
38
44
|
import { forwardRef, useState } from 'react';
|
39
45
|
import type { RelationalCSVDataState } from '../../../../stores/editor/editor-state/element-editor-state/data/EmbeddedDataState.js';
|
@@ -43,22 +49,90 @@ import {
|
|
43
49
|
} from '@finos/legend-lego/code-editor';
|
44
50
|
import { LEGEND_STUDIO_APPLICATION_NAVIGATION_CONTEXT_KEY } from '../../../../__lib__/LegendStudioApplicationNavigationContext.js';
|
45
51
|
import { useApplicationNavigationContext } from '@finos/legend-application';
|
52
|
+
import {
|
53
|
+
relationalData_addTable,
|
54
|
+
relationalData_setTableName,
|
55
|
+
relationalData_setTableSchemaName,
|
56
|
+
} from '../../../../stores/graph-modifier/DSL_Data_GraphModifierHelper.js';
|
57
|
+
import { createMockDataForMappingElementSource } from '../../../../stores/editor/utils/MockDataUtils.js';
|
46
58
|
|
47
|
-
|
59
|
+
interface TableOption {
|
60
|
+
value: Table;
|
61
|
+
label: string;
|
62
|
+
}
|
63
|
+
|
64
|
+
const RelationalTableIdentifierEditor = observer(
|
48
65
|
(props: { dataState: RelationalCSVDataState; isReadOnly: boolean }) => {
|
49
66
|
const { isReadOnly, dataState } = props;
|
50
|
-
const
|
51
|
-
const
|
67
|
+
const resolvedDb = dataState.database;
|
68
|
+
const existingDataTable = dataState.tableToEdit;
|
69
|
+
|
70
|
+
// table
|
71
|
+
const [schemaName, setSchemaName] = useState<string | undefined>(
|
72
|
+
existingDataTable?.schema,
|
73
|
+
);
|
74
|
+
const [tableName, setTableName] = useState<string | undefined>(
|
75
|
+
existingDataTable?.table,
|
76
|
+
);
|
77
|
+
// selectors if db provided
|
78
|
+
const tables = resolvedDb
|
79
|
+
? getAllTablesFromDatabase(resolvedDb)
|
80
|
+
: undefined;
|
81
|
+
const [dbTable, setDbTable] = useState<Table | undefined>(tables?.[0]);
|
82
|
+
const [includeBare, setIncludeBare] = useState(true);
|
83
|
+
const showFullPath = resolvedDb && resolvedDb.schemas.length > 2;
|
84
|
+
const tableOptions =
|
85
|
+
tables?.map((_t) => ({
|
86
|
+
label: showFullPath ? `${_t.schema.name}.${_t.name}` : `${_t.name}`,
|
87
|
+
value: _t,
|
88
|
+
})) ?? [];
|
89
|
+
const onTableChange = (val: TableOption | null): void => {
|
90
|
+
setDbTable(val?.value);
|
91
|
+
};
|
92
|
+
const selectedTable = dbTable
|
93
|
+
? {
|
94
|
+
label: showFullPath
|
95
|
+
? `${dbTable.schema.name}.${dbTable.name}`
|
96
|
+
: `${dbTable.name}`,
|
97
|
+
value: dbTable,
|
98
|
+
}
|
99
|
+
: undefined;
|
52
100
|
const closeModal = (): void => dataState.closeModal();
|
53
|
-
const
|
101
|
+
const changeSchemaValue: React.ChangeEventHandler<HTMLInputElement> = (
|
54
102
|
event,
|
55
103
|
) => {
|
56
|
-
|
104
|
+
setSchemaName(event.target.value);
|
57
105
|
};
|
58
|
-
const
|
106
|
+
const changeTableValue: React.ChangeEventHandler<HTMLInputElement> = (
|
59
107
|
event,
|
60
108
|
) => {
|
61
|
-
|
109
|
+
setTableName(event.target.value);
|
110
|
+
};
|
111
|
+
const toggleIncludeBare = (): void => {
|
112
|
+
setIncludeBare(!includeBare);
|
113
|
+
};
|
114
|
+
const useSelector = resolvedDb && !existingDataTable;
|
115
|
+
const isDisabled = useSelector ? !dbTable : !(schemaName && tableName);
|
116
|
+
|
117
|
+
const handleSubmit = (): void => {
|
118
|
+
const newTable = new RelationalCSVDataTable();
|
119
|
+
newTable.values = '';
|
120
|
+
const editTable = existingDataTable ?? newTable;
|
121
|
+
const _schemaName = useSelector ? dbTable?.schema.name : schemaName;
|
122
|
+
const _name = useSelector ? dbTable?.name : tableName;
|
123
|
+
relationalData_setTableSchemaName(editTable, _schemaName ?? '');
|
124
|
+
relationalData_setTableName(editTable, _name ?? '');
|
125
|
+
if (!existingDataTable && dbTable && includeBare) {
|
126
|
+
editTable.values = createMockDataForMappingElementSource(
|
127
|
+
dbTable,
|
128
|
+
dataState.editorStore,
|
129
|
+
);
|
130
|
+
}
|
131
|
+
if (!existingDataTable) {
|
132
|
+
relationalData_addTable(dataState.embeddedData, editTable);
|
133
|
+
dataState.changeSelectedTable(editTable);
|
134
|
+
}
|
135
|
+
closeModal();
|
62
136
|
};
|
63
137
|
return (
|
64
138
|
<Dialog
|
@@ -70,42 +144,71 @@ const RelationalTableIdentifierModal = observer(
|
|
70
144
|
<form
|
71
145
|
onSubmit={(event) => {
|
72
146
|
event.preventDefault();
|
73
|
-
|
147
|
+
handleSubmit();
|
74
148
|
closeModal();
|
75
149
|
}}
|
76
150
|
className="modal modal--dark search-modal"
|
77
151
|
>
|
78
152
|
<div className="modal__title">
|
79
|
-
{
|
153
|
+
{existingDataTable
|
80
154
|
? 'Rename Relational Data Table'
|
81
155
|
: 'Add Relational Data Table'}
|
82
156
|
</div>
|
83
157
|
<div className="relational-data-editor__identifier">
|
84
|
-
|
85
|
-
|
86
|
-
className="
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
158
|
+
{resolvedDb && !existingDataTable ? (
|
159
|
+
<>
|
160
|
+
<div className="panel__content__form__section">
|
161
|
+
<div className="panel__content__form__section__header__label">
|
162
|
+
Table
|
163
|
+
</div>
|
164
|
+
<div className="explorer__new-element-modal__driver">
|
165
|
+
<CustomSelectorInput
|
166
|
+
className="explorer__new-element-modal__driver__dropdown"
|
167
|
+
options={tableOptions}
|
168
|
+
onChange={onTableChange}
|
169
|
+
value={selectedTable}
|
170
|
+
isClearable={false}
|
171
|
+
darkMode={true}
|
172
|
+
/>
|
173
|
+
</div>
|
174
|
+
</div>
|
175
|
+
<PanelFormBooleanField
|
176
|
+
isReadOnly={isReadOnly}
|
177
|
+
value={includeBare}
|
178
|
+
name="Include Columns and First Row"
|
179
|
+
prompt="Will include table columns and first row using table definition"
|
180
|
+
update={toggleIncludeBare}
|
181
|
+
/>
|
182
|
+
</>
|
183
|
+
) : (
|
184
|
+
<>
|
185
|
+
<div className="relational-data-editor__identifier__values">
|
186
|
+
<input
|
187
|
+
className="panel__content__form__section__input"
|
188
|
+
disabled={isReadOnly}
|
189
|
+
placeholder="schemaName"
|
190
|
+
value={schemaName}
|
191
|
+
onChange={changeSchemaValue}
|
192
|
+
/>
|
193
|
+
</div>
|
194
|
+
<div className="relational-data-editor__identifier__values">
|
195
|
+
<input
|
196
|
+
className="relational-data-editor__identifier__values panel__content__form__section__input"
|
197
|
+
disabled={isReadOnly}
|
198
|
+
placeholder="tableName"
|
199
|
+
value={tableName}
|
200
|
+
onChange={changeTableValue}
|
201
|
+
/>
|
202
|
+
</div>
|
203
|
+
</>
|
204
|
+
)}
|
102
205
|
</div>
|
103
206
|
<div className="search-modal__actions">
|
104
207
|
<button
|
105
208
|
className="btn btn--dark"
|
106
|
-
disabled={
|
209
|
+
disabled={isDisabled || isReadOnly}
|
107
210
|
>
|
108
|
-
{
|
211
|
+
{existingDataTable ? 'Rename' : 'Add'}
|
109
212
|
</button>
|
110
213
|
</div>
|
111
214
|
</form>
|
@@ -314,7 +417,7 @@ export const RelationalCSVDataEditor = observer(
|
|
314
417
|
/>
|
315
418
|
)}
|
316
419
|
{dataState.showTableIdentifierModal && (
|
317
|
-
<
|
420
|
+
<RelationalTableIdentifierEditor
|
318
421
|
dataState={dataState}
|
319
422
|
isReadOnly={isReadOnly}
|
320
423
|
/>
|