@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.
Files changed (156) hide show
  1. package/lib/__lib__/LegendStudioEvent.d.ts +1 -0
  2. package/lib/__lib__/LegendStudioEvent.d.ts.map +1 -1
  3. package/lib/__lib__/LegendStudioEvent.js +1 -0
  4. package/lib/__lib__/LegendStudioEvent.js.map +1 -1
  5. package/lib/components/editor/editor-group/FunctionEditor.d.ts.map +1 -1
  6. package/lib/components/editor/editor-group/FunctionEditor.js +28 -24
  7. package/lib/components/editor/editor-group/FunctionEditor.js.map +1 -1
  8. package/lib/components/editor/editor-group/connection-editor/{DatabaseBuilder.d.ts → DatabaseBuilderWizard.d.ts} +4 -11
  9. package/lib/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.d.ts.map +1 -0
  10. package/lib/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.js +48 -0
  11. package/lib/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.js.map +1 -0
  12. package/lib/components/editor/editor-group/connection-editor/DatabaseSchemaExplorer.d.ts +32 -0
  13. package/lib/components/editor/editor-group/connection-editor/DatabaseSchemaExplorer.d.ts.map +1 -0
  14. package/lib/components/editor/editor-group/connection-editor/DatabaseSchemaExplorer.js +99 -0
  15. package/lib/components/editor/editor-group/connection-editor/DatabaseSchemaExplorer.js.map +1 -0
  16. package/lib/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.js +1 -1
  17. package/lib/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.js.map +1 -1
  18. package/lib/components/editor/editor-group/data-editor/EmbeddedDataEditor.d.ts.map +1 -1
  19. package/lib/components/editor/editor-group/data-editor/EmbeddedDataEditor.js +5 -4
  20. package/lib/components/editor/editor-group/data-editor/EmbeddedDataEditor.js.map +1 -1
  21. package/lib/components/editor/editor-group/data-editor/RelationalCSVDataEditor.d.ts.map +1 -1
  22. package/lib/components/editor/editor-group/data-editor/RelationalCSVDataEditor.js +62 -12
  23. package/lib/components/editor/editor-group/data-editor/RelationalCSVDataEditor.js.map +1 -1
  24. package/lib/components/editor/editor-group/mapping-editor/MappingTestableEditor.d.ts +1 -1
  25. package/lib/components/editor/editor-group/mapping-editor/MappingTestableEditor.d.ts.map +1 -1
  26. package/lib/components/editor/editor-group/mapping-editor/MappingTestableEditor.js +101 -137
  27. package/lib/components/editor/editor-group/mapping-editor/MappingTestableEditor.js.map +1 -1
  28. package/lib/components/editor/editor-group/testable/TestableSharedComponents.d.ts +11 -0
  29. package/lib/components/editor/editor-group/testable/TestableSharedComponents.d.ts.map +1 -1
  30. package/lib/components/editor/editor-group/testable/TestableSharedComponents.js +27 -2
  31. package/lib/components/editor/editor-group/testable/TestableSharedComponents.js.map +1 -1
  32. package/lib/components/editor/panel-group/SQLPlaygroundPanel.d.ts +0 -7
  33. package/lib/components/editor/panel-group/SQLPlaygroundPanel.d.ts.map +1 -1
  34. package/lib/components/editor/panel-group/SQLPlaygroundPanel.js +20 -77
  35. package/lib/components/editor/panel-group/SQLPlaygroundPanel.js.map +1 -1
  36. package/lib/components/editor/side-bar/Explorer.js +3 -3
  37. package/lib/components/editor/side-bar/Explorer.js.map +1 -1
  38. package/lib/components/editor/side-bar/WorkflowManager.d.ts.map +1 -1
  39. package/lib/components/editor/side-bar/WorkflowManager.js +6 -1
  40. package/lib/components/editor/side-bar/WorkflowManager.js.map +1 -1
  41. package/lib/index.css +2 -2
  42. package/lib/index.css.map +1 -1
  43. package/lib/package.json +3 -3
  44. package/lib/stores/editor/ExplorerTreeState.d.ts +4 -4
  45. package/lib/stores/editor/ExplorerTreeState.d.ts.map +1 -1
  46. package/lib/stores/editor/ExplorerTreeState.js +4 -4
  47. package/lib/stores/editor/ExplorerTreeState.js.map +1 -1
  48. package/lib/stores/editor/NewElementState.d.ts.map +1 -1
  49. package/lib/stores/editor/NewElementState.js.map +1 -1
  50. package/lib/stores/editor/editor-state/element-editor-state/FunctionEditorState.d.ts +12 -12
  51. package/lib/stores/editor/editor-state/element-editor-state/FunctionEditorState.d.ts.map +1 -1
  52. package/lib/stores/editor/editor-state/element-editor-state/FunctionEditorState.js +45 -46
  53. package/lib/stores/editor/editor-state/element-editor-state/FunctionEditorState.js.map +1 -1
  54. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.d.ts +20 -29
  55. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.d.ts.map +1 -1
  56. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.js +60 -141
  57. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.js.map +1 -1
  58. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.d.ts +33 -0
  59. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.d.ts.map +1 -0
  60. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.js +71 -0
  61. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.js.map +1 -0
  62. package/lib/stores/editor/editor-state/element-editor-state/data/DataEditorState.d.ts +2 -2
  63. package/lib/stores/editor/editor-state/element-editor-state/data/DataEditorState.d.ts.map +1 -1
  64. package/lib/stores/editor/editor-state/element-editor-state/data/DataEditorState.js +2 -2
  65. package/lib/stores/editor/editor-state/element-editor-state/data/DataEditorState.js.map +1 -1
  66. package/lib/stores/editor/editor-state/element-editor-state/data/EmbeddedDataState.d.ts +14 -19
  67. package/lib/stores/editor/editor-state/element-editor-state/data/EmbeddedDataState.d.ts.map +1 -1
  68. package/lib/stores/editor/editor-state/element-editor-state/data/EmbeddedDataState.js +30 -65
  69. package/lib/stores/editor/editor-state/element-editor-state/data/EmbeddedDataState.js.map +1 -1
  70. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.d.ts +56 -78
  71. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.d.ts.map +1 -1
  72. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.js +285 -384
  73. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.js.map +1 -1
  74. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestingHelper.d.ts +23 -0
  75. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestingHelper.d.ts.map +1 -0
  76. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestingHelper.js +129 -0
  77. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestingHelper.js.map +1 -0
  78. package/lib/stores/editor/editor-state/element-editor-state/service/ServiceEditorState.d.ts.map +1 -1
  79. package/lib/stores/editor/editor-state/element-editor-state/service/ServiceEditorState.js +2 -2
  80. package/lib/stores/editor/editor-state/element-editor-state/service/ServiceEditorState.js.map +1 -1
  81. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestDataState.d.ts +1 -0
  82. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestDataState.d.ts.map +1 -1
  83. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestDataState.js +12 -2
  84. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestDataState.js.map +1 -1
  85. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestableState.d.ts.map +1 -1
  86. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestableState.js +15 -8
  87. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestableState.js.map +1 -1
  88. package/lib/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.d.ts +7 -4
  89. package/lib/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.d.ts.map +1 -1
  90. package/lib/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.js +53 -10
  91. package/lib/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.js.map +1 -1
  92. package/lib/stores/editor/editor-state/element-editor-state/testable/TestableEditorState.d.ts +2 -1
  93. package/lib/stores/editor/editor-state/element-editor-state/testable/TestableEditorState.d.ts.map +1 -1
  94. package/lib/stores/editor/editor-state/element-editor-state/testable/TestableEditorState.js +20 -16
  95. package/lib/stores/editor/editor-state/element-editor-state/testable/TestableEditorState.js.map +1 -1
  96. package/lib/stores/editor/panel-group/SQLPlaygroundPanelState.d.ts +3 -48
  97. package/lib/stores/editor/panel-group/SQLPlaygroundPanelState.d.ts.map +1 -1
  98. package/lib/stores/editor/panel-group/SQLPlaygroundPanelState.js +12 -350
  99. package/lib/stores/editor/panel-group/SQLPlaygroundPanelState.js.map +1 -1
  100. package/lib/stores/editor/sidebar-state/WorkflowManagerState.d.ts +5 -0
  101. package/lib/stores/editor/sidebar-state/WorkflowManagerState.d.ts.map +1 -1
  102. package/lib/stores/editor/sidebar-state/WorkflowManagerState.js +26 -0
  103. package/lib/stores/editor/sidebar-state/WorkflowManagerState.js.map +1 -1
  104. package/lib/stores/editor/sidebar-state/testable/GlobalTestRunnerState.d.ts +1 -1
  105. package/lib/stores/editor/sidebar-state/testable/GlobalTestRunnerState.d.ts.map +1 -1
  106. package/lib/stores/editor/sidebar-state/testable/GlobalTestRunnerState.js +3 -0
  107. package/lib/stores/editor/sidebar-state/testable/GlobalTestRunnerState.js.map +1 -1
  108. package/lib/stores/editor/utils/MockDataUtils.d.ts.map +1 -1
  109. package/lib/stores/editor/utils/MockDataUtils.js +3 -0
  110. package/lib/stores/editor/utils/MockDataUtils.js.map +1 -1
  111. package/lib/stores/editor/utils/TestableUtils.d.ts +11 -1
  112. package/lib/stores/editor/utils/TestableUtils.d.ts.map +1 -1
  113. package/lib/stores/editor/utils/TestableUtils.js +50 -1
  114. package/lib/stores/editor/utils/TestableUtils.js.map +1 -1
  115. package/lib/stores/graph-modifier/DSL_Mapping_GraphModifierHelper.d.ts +5 -4
  116. package/lib/stores/graph-modifier/DSL_Mapping_GraphModifierHelper.d.ts.map +1 -1
  117. package/lib/stores/graph-modifier/DSL_Mapping_GraphModifierHelper.js +4 -1
  118. package/lib/stores/graph-modifier/DSL_Mapping_GraphModifierHelper.js.map +1 -1
  119. package/package.json +9 -9
  120. package/src/__lib__/LegendStudioEvent.ts +1 -1
  121. package/src/components/editor/editor-group/FunctionEditor.tsx +133 -118
  122. package/src/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.tsx +191 -0
  123. package/src/components/editor/editor-group/connection-editor/DatabaseSchemaExplorer.tsx +227 -0
  124. package/src/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.tsx +1 -1
  125. package/src/components/editor/editor-group/data-editor/EmbeddedDataEditor.tsx +34 -37
  126. package/src/components/editor/editor-group/data-editor/RelationalCSVDataEditor.tsx +134 -31
  127. package/src/components/editor/editor-group/mapping-editor/MappingTestableEditor.tsx +296 -414
  128. package/src/components/editor/editor-group/testable/TestableSharedComponents.tsx +88 -3
  129. package/src/components/editor/panel-group/SQLPlaygroundPanel.tsx +47 -211
  130. package/src/components/editor/side-bar/Explorer.tsx +3 -3
  131. package/src/components/editor/side-bar/WorkflowManager.tsx +10 -0
  132. package/src/stores/editor/ExplorerTreeState.ts +6 -9
  133. package/src/stores/editor/NewElementState.ts +0 -1
  134. package/src/stores/editor/editor-state/element-editor-state/FunctionEditorState.ts +44 -50
  135. package/src/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.ts +88 -212
  136. package/src/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.ts +102 -0
  137. package/src/stores/editor/editor-state/element-editor-state/data/DataEditorState.ts +7 -1
  138. package/src/stores/editor/editor-state/element-editor-state/data/EmbeddedDataState.ts +48 -77
  139. package/src/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.ts +407 -617
  140. package/src/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestingHelper.ts +243 -0
  141. package/src/stores/editor/editor-state/element-editor-state/service/ServiceEditorState.ts +6 -2
  142. package/src/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestDataState.ts +18 -1
  143. package/src/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestableState.ts +20 -12
  144. package/src/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.ts +76 -18
  145. package/src/stores/editor/editor-state/element-editor-state/testable/TestableEditorState.ts +29 -24
  146. package/src/stores/editor/panel-group/SQLPlaygroundPanelState.ts +13 -533
  147. package/src/stores/editor/sidebar-state/WorkflowManagerState.ts +47 -0
  148. package/src/stores/editor/sidebar-state/testable/GlobalTestRunnerState.ts +4 -1
  149. package/src/stores/editor/utils/MockDataUtils.ts +2 -0
  150. package/src/stores/editor/utils/TestableUtils.ts +73 -0
  151. package/src/stores/graph-modifier/DSL_Mapping_GraphModifierHelper.ts +15 -12
  152. package/tsconfig.json +4 -1
  153. package/lib/components/editor/editor-group/connection-editor/DatabaseBuilder.d.ts.map +0 -1
  154. package/lib/components/editor/editor-group/connection-editor/DatabaseBuilder.js +0 -133
  155. package/lib/components/editor/editor-group/connection-editor/DatabaseBuilder.js.map +0 -1
  156. 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
+ );
@@ -1109,7 +1109,7 @@ const RelationalConnectionStoreEditor = observer(
1109
1109
  }
1110
1110
  };
1111
1111
  const openDatabaseBuilder = (): void =>
1112
- connectionValueState.editorStore.explorerTreeState.buildDbBuilderState(
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
- <div className={clsx('external-format-data-editor__content')}>
156
- <div className="external-format-data-editor__content__input">
157
- <CodeEditor
158
- language={language}
159
- inputValue={externalFormatDataState.embeddedData.data}
160
- updateInput={changeData}
161
- hideGutter={true}
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
- <div>
283
- <div className="sample-data-generator__controller">
284
- <div
285
- className="sample-data-generator__controller__icon"
286
- title="class"
287
- >
288
- <PURE_ClassIcon />
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
- <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
- />
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 type { RelationalCSVDataTable } from '@finos/legend-graph';
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
- const RelationalTableIdentifierModal = observer(
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 tableIdentifierState = dataState.tableIdentifierState;
51
- const editableTable = tableIdentifierState.table;
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 changeTableValue: React.ChangeEventHandler<HTMLInputElement> = (
101
+ const changeSchemaValue: React.ChangeEventHandler<HTMLInputElement> = (
54
102
  event,
55
103
  ) => {
56
- tableIdentifierState.setTableName(event.target.value);
104
+ setSchemaName(event.target.value);
57
105
  };
58
- const changeSchemaValue: React.ChangeEventHandler<HTMLInputElement> = (
106
+ const changeTableValue: React.ChangeEventHandler<HTMLInputElement> = (
59
107
  event,
60
108
  ) => {
61
- tableIdentifierState.setSchemaName(event.target.value);
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
- tableIdentifierState.handleSubmit();
147
+ handleSubmit();
74
148
  closeModal();
75
149
  }}
76
150
  className="modal modal--dark search-modal"
77
151
  >
78
152
  <div className="modal__title">
79
- {editableTable
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
- <div className="relational-data-editor__identifier__values">
85
- <input
86
- className="panel__content__form__section__input"
87
- disabled={isReadOnly}
88
- placeholder="schemaName"
89
- value={tableIdentifierState.schemaName}
90
- onChange={changeSchemaValue}
91
- />
92
- </div>
93
- <div className="relational-data-editor__identifier__values">
94
- <input
95
- className="relational-data-editor__identifier__values panel__content__form__section__input"
96
- disabled={isReadOnly}
97
- placeholder="tableName"
98
- value={tableIdentifierState.tableName}
99
- onChange={changeTableValue}
100
- />
101
- </div>
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={tableIdentifierState.isEditingDisabled || isReadOnly}
209
+ disabled={isDisabled || isReadOnly}
107
210
  >
108
- {editableTable ? 'Rename' : 'Add'}
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
- <RelationalTableIdentifierModal
420
+ <RelationalTableIdentifierEditor
318
421
  dataState={dataState}
319
422
  isReadOnly={isReadOnly}
320
423
  />