@finos/legend-application-studio 28.8.0 → 28.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/lib/__lib__/LegendStudioCommand.d.ts +1 -0
  2. package/lib/__lib__/LegendStudioCommand.d.ts.map +1 -1
  3. package/lib/__lib__/LegendStudioCommand.js +5 -0
  4. package/lib/__lib__/LegendStudioCommand.js.map +1 -1
  5. package/lib/__lib__/LegendStudioNavigation.d.ts +6 -0
  6. package/lib/__lib__/LegendStudioNavigation.d.ts.map +1 -1
  7. package/lib/__lib__/LegendStudioNavigation.js +5 -0
  8. package/lib/__lib__/LegendStudioNavigation.js.map +1 -1
  9. package/lib/components/LegendStudioWebApplication.d.ts.map +1 -1
  10. package/lib/components/LegendStudioWebApplication.js +4 -1
  11. package/lib/components/LegendStudioWebApplication.js.map +1 -1
  12. package/lib/components/ShowcaseManager.d.ts.map +1 -1
  13. package/lib/components/ShowcaseManager.js +10 -2
  14. package/lib/components/ShowcaseManager.js.map +1 -1
  15. package/lib/components/editor/ActivityBar.d.ts.map +1 -1
  16. package/lib/components/editor/ActivityBar.js +20 -17
  17. package/lib/components/editor/ActivityBar.js.map +1 -1
  18. package/lib/components/editor/editor-group/EditorGroup.d.ts.map +1 -1
  19. package/lib/components/editor/editor-group/EditorGroup.js +7 -1
  20. package/lib/components/editor/editor-group/EditorGroup.js.map +1 -1
  21. package/lib/components/editor/editor-group/GrammarTextEditor.js +1 -1
  22. package/lib/components/editor/editor-group/GrammarTextEditor.js.map +1 -1
  23. package/lib/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.d.ts +5 -0
  24. package/lib/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.d.ts.map +1 -1
  25. package/lib/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.js +28 -10
  26. package/lib/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.js.map +1 -1
  27. package/lib/components/editor/editor-group/connection-editor/DatabaseModelBuilder.d.ts +11 -0
  28. package/lib/components/editor/editor-group/connection-editor/DatabaseModelBuilder.d.ts.map +1 -1
  29. package/lib/components/editor/editor-group/connection-editor/DatabaseModelBuilder.js +22 -10
  30. package/lib/components/editor/editor-group/connection-editor/DatabaseModelBuilder.js.map +1 -1
  31. package/lib/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.d.ts +7 -0
  32. package/lib/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.d.ts.map +1 -1
  33. package/lib/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.js +3 -3
  34. package/lib/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.js.map +1 -1
  35. package/lib/components/editor/editor-group/end-to-end-flow-editor/QueryConnectionWorkflowEditor.d.ts +59 -0
  36. package/lib/components/editor/editor-group/end-to-end-flow-editor/QueryConnectionWorkflowEditor.d.ts.map +1 -0
  37. package/lib/components/editor/editor-group/end-to-end-flow-editor/QueryConnectionWorkflowEditor.js +145 -0
  38. package/lib/components/editor/editor-group/end-to-end-flow-editor/QueryConnectionWorkflowEditor.js.map +1 -0
  39. package/lib/components/editor/side-bar/Explorer.d.ts.map +1 -1
  40. package/lib/components/editor/side-bar/Explorer.js +3 -2
  41. package/lib/components/editor/side-bar/Explorer.js.map +1 -1
  42. package/lib/components/editor/side-bar/SideBar.d.ts.map +1 -1
  43. package/lib/components/editor/side-bar/SideBar.js +4 -1
  44. package/lib/components/editor/side-bar/SideBar.js.map +1 -1
  45. package/lib/components/editor/side-bar/end-to-end-workflow/EndToEndWorkflows.d.ts +23 -0
  46. package/lib/components/editor/side-bar/end-to-end-workflow/EndToEndWorkflows.d.ts.map +1 -0
  47. package/lib/components/editor/side-bar/end-to-end-workflow/EndToEndWorkflows.js +41 -0
  48. package/lib/components/editor/side-bar/end-to-end-workflow/EndToEndWorkflows.js.map +1 -0
  49. package/lib/components/project-view/ProjectViewer.d.ts.map +1 -1
  50. package/lib/components/project-view/ProjectViewer.js +37 -5
  51. package/lib/components/project-view/ProjectViewer.js.map +1 -1
  52. package/lib/components/showcase/ShowcaseViewer.d.ts +18 -0
  53. package/lib/components/showcase/ShowcaseViewer.d.ts.map +1 -0
  54. package/lib/components/showcase/ShowcaseViewer.js +147 -0
  55. package/lib/components/showcase/ShowcaseViewer.js.map +1 -0
  56. package/lib/components/showcase/ShowcaseViewerStoreProvider.d.ts +23 -0
  57. package/lib/components/showcase/ShowcaseViewerStoreProvider.d.ts.map +1 -0
  58. package/lib/components/showcase/ShowcaseViewerStoreProvider.js +36 -0
  59. package/lib/components/showcase/ShowcaseViewerStoreProvider.js.map +1 -0
  60. package/lib/index.css +2 -2
  61. package/lib/index.css.map +1 -1
  62. package/lib/package.json +1 -1
  63. package/lib/stores/LegendStudioBaseStore.d.ts.map +1 -1
  64. package/lib/stores/LegendStudioBaseStore.js +1 -0
  65. package/lib/stores/LegendStudioBaseStore.js.map +1 -1
  66. package/lib/stores/ShowcaseManagerState.d.ts +1 -0
  67. package/lib/stores/ShowcaseManagerState.d.ts.map +1 -1
  68. package/lib/stores/ShowcaseManagerState.js +11 -1
  69. package/lib/stores/ShowcaseManagerState.js.map +1 -1
  70. package/lib/stores/editor/EditorConfig.d.ts +3 -1
  71. package/lib/stores/editor/EditorConfig.d.ts.map +1 -1
  72. package/lib/stores/editor/EditorConfig.js +4 -1
  73. package/lib/stores/editor/EditorConfig.js.map +1 -1
  74. package/lib/stores/editor/EditorMode.d.ts +4 -0
  75. package/lib/stores/editor/EditorMode.d.ts.map +1 -1
  76. package/lib/stores/editor/EditorMode.js +9 -0
  77. package/lib/stores/editor/EditorMode.js.map +1 -1
  78. package/lib/stores/editor/EditorStore.d.ts +2 -0
  79. package/lib/stores/editor/EditorStore.d.ts.map +1 -1
  80. package/lib/stores/editor/EditorStore.js +14 -3
  81. package/lib/stores/editor/EditorStore.js.map +1 -1
  82. package/lib/stores/editor/ExplorerTreeState.d.ts.map +1 -1
  83. package/lib/stores/editor/ExplorerTreeState.js +1 -1
  84. package/lib/stores/editor/ExplorerTreeState.js.map +1 -1
  85. package/lib/stores/editor/GraphEditGrammarModeState.d.ts.map +1 -1
  86. package/lib/stores/editor/GraphEditGrammarModeState.js.map +1 -1
  87. package/lib/stores/editor/NewElementState.d.ts +1 -0
  88. package/lib/stores/editor/NewElementState.d.ts.map +1 -1
  89. package/lib/stores/editor/NewElementState.js +1 -1
  90. package/lib/stores/editor/NewElementState.js.map +1 -1
  91. package/lib/stores/editor/StandardEditorMode.d.ts +1 -0
  92. package/lib/stores/editor/StandardEditorMode.d.ts.map +1 -1
  93. package/lib/stores/editor/StandardEditorMode.js +4 -0
  94. package/lib/stores/editor/StandardEditorMode.js.map +1 -1
  95. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.d.ts +6 -2
  96. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.d.ts.map +1 -1
  97. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.js +53 -34
  98. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.js.map +1 -1
  99. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.d.ts.map +1 -1
  100. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.js +1 -1
  101. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.js.map +1 -1
  102. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseModelBuilderState.d.ts +3 -2
  103. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseModelBuilderState.d.ts.map +1 -1
  104. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseModelBuilderState.js +8 -5
  105. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseModelBuilderState.js.map +1 -1
  106. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.d.ts.map +1 -1
  107. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.js +20 -4
  108. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.js.map +1 -1
  109. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestingHelper.d.ts +3 -0
  110. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestingHelper.d.ts.map +1 -1
  111. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestingHelper.js +17 -2
  112. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestingHelper.js.map +1 -1
  113. package/lib/stores/editor/editor-state/end-to-end-workflow-state/EndToEndWorkflowEditorState.d.ts +22 -0
  114. package/lib/stores/editor/editor-state/end-to-end-workflow-state/EndToEndWorkflowEditorState.d.ts.map +1 -0
  115. package/lib/stores/editor/editor-state/end-to-end-workflow-state/EndToEndWorkflowEditorState.js +25 -0
  116. package/lib/stores/editor/editor-state/end-to-end-workflow-state/EndToEndWorkflowEditorState.js.map +1 -0
  117. package/lib/stores/editor/sidebar-state/end-to-end-workflow/GlobalEndToEndFlowState.d.ts +113 -0
  118. package/lib/stores/editor/sidebar-state/end-to-end-workflow/GlobalEndToEndFlowState.d.ts.map +1 -0
  119. package/lib/stores/editor/sidebar-state/end-to-end-workflow/GlobalEndToEndFlowState.js +494 -0
  120. package/lib/stores/editor/sidebar-state/end-to-end-workflow/GlobalEndToEndFlowState.js.map +1 -0
  121. package/lib/stores/project-view/ProjectViewerEditorMode.d.ts +3 -0
  122. package/lib/stores/project-view/ProjectViewerEditorMode.d.ts.map +1 -1
  123. package/lib/stores/project-view/ProjectViewerEditorMode.js +10 -0
  124. package/lib/stores/project-view/ProjectViewerEditorMode.js.map +1 -1
  125. package/lib/stores/showcase/ShowcaseViewerEditorMode.d.ts +28 -0
  126. package/lib/stores/showcase/ShowcaseViewerEditorMode.d.ts.map +1 -0
  127. package/lib/stores/showcase/ShowcaseViewerEditorMode.js +40 -0
  128. package/lib/stores/showcase/ShowcaseViewerEditorMode.js.map +1 -0
  129. package/lib/stores/showcase/ShowcaseViewerStore.d.ts +32 -0
  130. package/lib/stores/showcase/ShowcaseViewerStore.d.ts.map +1 -0
  131. package/lib/stores/showcase/ShowcaseViewerStore.js +193 -0
  132. package/lib/stores/showcase/ShowcaseViewerStore.js.map +1 -0
  133. package/package.json +7 -7
  134. package/src/__lib__/LegendStudioCommand.ts +5 -0
  135. package/src/__lib__/LegendStudioNavigation.ts +11 -0
  136. package/src/components/LegendStudioWebApplication.tsx +11 -1
  137. package/src/components/ShowcaseManager.tsx +44 -2
  138. package/src/components/editor/ActivityBar.tsx +56 -15
  139. package/src/components/editor/editor-group/EditorGroup.tsx +21 -1
  140. package/src/components/editor/editor-group/GrammarTextEditor.tsx +1 -1
  141. package/src/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.tsx +135 -103
  142. package/src/components/editor/editor-group/connection-editor/DatabaseModelBuilder.tsx +97 -53
  143. package/src/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.tsx +4 -3
  144. package/src/components/editor/editor-group/end-to-end-flow-editor/QueryConnectionWorkflowEditor.tsx +478 -0
  145. package/src/components/editor/side-bar/Explorer.tsx +20 -12
  146. package/src/components/editor/side-bar/SideBar.tsx +13 -1
  147. package/src/components/editor/side-bar/end-to-end-workflow/EndToEndWorkflows.tsx +101 -0
  148. package/src/components/project-view/ProjectViewer.tsx +139 -4
  149. package/src/components/showcase/ShowcaseViewer.tsx +418 -0
  150. package/src/components/showcase/ShowcaseViewerStoreProvider.tsx +56 -0
  151. package/src/stores/LegendStudioBaseStore.ts +1 -0
  152. package/src/stores/ShowcaseManagerState.ts +19 -1
  153. package/src/stores/editor/EditorConfig.ts +3 -0
  154. package/src/stores/editor/EditorMode.ts +14 -0
  155. package/src/stores/editor/EditorStore.ts +17 -8
  156. package/src/stores/editor/ExplorerTreeState.ts +1 -0
  157. package/src/stores/editor/GraphEditGrammarModeState.ts +3 -3
  158. package/src/stores/editor/NewElementState.ts +1 -1
  159. package/src/stores/editor/StandardEditorMode.ts +7 -0
  160. package/src/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.ts +77 -49
  161. package/src/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.ts +1 -2
  162. package/src/stores/editor/editor-state/element-editor-state/connection/DatabaseModelBuilderState.ts +12 -8
  163. package/src/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.ts +31 -9
  164. package/src/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestingHelper.ts +23 -0
  165. package/src/stores/editor/editor-state/end-to-end-workflow-state/EndToEndWorkflowEditorState.ts +25 -0
  166. package/src/stores/editor/sidebar-state/end-to-end-workflow/GlobalEndToEndFlowState.tsx +884 -0
  167. package/src/stores/project-view/ProjectViewerEditorMode.ts +17 -0
  168. package/src/stores/showcase/ShowcaseViewerEditorMode.ts +51 -0
  169. package/src/stores/showcase/ShowcaseViewerStore.ts +289 -0
  170. package/tsconfig.json +9 -1
@@ -828,7 +828,7 @@ export const GrammarTextEditor = observer(() => {
828
828
  }
829
829
  }
830
830
  // Disable editing if user is in viewer mode
831
- editor.updateOptions({ readOnly: editorStore.isInViewerMode });
831
+ editor.updateOptions({ readOnly: editorStore.editorMode.disableEditing });
832
832
 
833
833
  // hover
834
834
  hoverProviderDisposer.current?.dispose();
@@ -127,6 +127,138 @@ const QueryBuilderGridResult = observer(
127
127
  },
128
128
  );
129
129
 
130
+ export const DatabaseBuilderModalContent = observer(
131
+ (props: { databaseBuilderState: DatabaseBuilderWizardState }) => {
132
+ const { databaseBuilderState } = props;
133
+ const applicationStore = useApplicationStore();
134
+ const schemaExplorerState = databaseBuilderState.schemaExplorerState;
135
+ const isCreatingNewDatabase = schemaExplorerState.isCreatingNewDatabase;
136
+ const elementAlreadyExistsMessage =
137
+ isCreatingNewDatabase &&
138
+ databaseBuilderState.editorStore.graphManagerState.graph.allElements
139
+ .map((s) => s.path)
140
+ .includes(schemaExplorerState.targetDatabasePath)
141
+ ? 'Element with same path already exists'
142
+ : undefined;
143
+
144
+ const isExecutingAction =
145
+ schemaExplorerState.isGeneratingDatabase ||
146
+ schemaExplorerState.isUpdatingDatabase;
147
+
148
+ const onTargetPathChange: React.ChangeEventHandler<HTMLInputElement> = (
149
+ event,
150
+ ) => {
151
+ schemaExplorerState.setTargetDatabasePath(event.target.value);
152
+ };
153
+
154
+ useEffect(() => {
155
+ flowResult(schemaExplorerState.fetchDatabaseMetadata()).catch(
156
+ applicationStore.alertUnhandledError,
157
+ );
158
+ }, [applicationStore, schemaExplorerState]);
159
+
160
+ useConditionedApplicationNavigationContext(
161
+ LEGEND_STUDIO_APPLICATION_NAVIGATION_CONTEXT_KEY.DATABASE_BUILDER,
162
+ databaseBuilderState.showModal,
163
+ );
164
+
165
+ return (
166
+ <ModalBody className="database-builder__content">
167
+ <PanelLoadingIndicator isLoading={isExecutingAction} />
168
+ <ResizablePanelGroup orientation="vertical">
169
+ <ResizablePanel size={450}>
170
+ <ResizablePanelGroup>
171
+ <ResizablePanel>
172
+ <div className="database-builder__config">
173
+ <PanelHeader title="schema explorer" />
174
+ <PanelContent className="database-builder__config__content">
175
+ {schemaExplorerState.treeData && (
176
+ <DatabaseSchemaExplorer
177
+ treeData={schemaExplorerState.treeData}
178
+ isReadOnly={false}
179
+ schemaExplorerState={
180
+ databaseBuilderState.schemaExplorerState
181
+ }
182
+ />
183
+ )}
184
+ </PanelContent>
185
+ </div>
186
+ </ResizablePanel>
187
+ <ResizablePanelSplitter>
188
+ <ResizablePanelSplitterLine
189
+ color={'var(--color-dark-grey-250)'}
190
+ />
191
+ </ResizablePanelSplitter>
192
+ <ResizablePanel>
193
+ <div className="database-builder__config">
194
+ <PanelHeader title="preview" />
195
+ <PanelContent className="database-builder__config__content">
196
+ {databaseBuilderState.schemaExplorerState.previewer && (
197
+ <QueryBuilderGridResult
198
+ executionResult={
199
+ databaseBuilderState.schemaExplorerState.previewer
200
+ }
201
+ />
202
+ )}
203
+ </PanelContent>
204
+ </div>
205
+ </ResizablePanel>
206
+ </ResizablePanelGroup>
207
+ </ResizablePanel>
208
+ <ResizablePanelSplitter />
209
+ <ResizablePanel>
210
+ <Panel className="database-builder__model">
211
+ <PanelHeader title="database model" />
212
+ <PanelContent>
213
+ <div className="database-builder__modeler">
214
+ <div className="panel__content__form__section database-builder__modeler__path">
215
+ <div className="panel__content__form__section__header__label">
216
+ Target Database Path
217
+ </div>
218
+ <InputWithInlineValidation
219
+ className="panel__content__form__section__input"
220
+ spellCheck={false}
221
+ onChange={onTargetPathChange}
222
+ disabled={
223
+ schemaExplorerState.makeTargetDatabasePathEditable
224
+ ? false
225
+ : !isCreatingNewDatabase
226
+ }
227
+ value={
228
+ schemaExplorerState.makeTargetDatabasePathEditable ||
229
+ isCreatingNewDatabase
230
+ ? schemaExplorerState.targetDatabasePath
231
+ : schemaExplorerState.database.path
232
+ }
233
+ error={elementAlreadyExistsMessage}
234
+ showEditableIcon={true}
235
+ />
236
+ </div>
237
+ <div className="database-builder__modeler__preview">
238
+ <div className="database-builder__modeler__preview__header">
239
+ readonly
240
+ </div>
241
+ {databaseBuilderState.databaseGrammarCode && (
242
+ <CodeEditor
243
+ language={CODE_EDITOR_LANGUAGE.PURE}
244
+ inputValue={databaseBuilderState.databaseGrammarCode}
245
+ isReadOnly={true}
246
+ />
247
+ )}
248
+ {!databaseBuilderState.databaseGrammarCode && (
249
+ <BlankPanelContent>No database preview</BlankPanelContent>
250
+ )}
251
+ </div>
252
+ </div>
253
+ </PanelContent>
254
+ </Panel>
255
+ </ResizablePanel>
256
+ </ResizablePanelGroup>
257
+ </ModalBody>
258
+ );
259
+ },
260
+ );
261
+
130
262
  export const DatabaseBuilderWizard = observer(
131
263
  (props: {
132
264
  databaseBuilderState: DatabaseBuilderWizardState;
@@ -147,11 +279,6 @@ export const DatabaseBuilderWizard = observer(
147
279
  const preview = applicationStore.guardUnhandledError(() =>
148
280
  flowResult(databaseBuilderState.previewDatabaseModel()),
149
281
  );
150
- const onTargetPathChange: React.ChangeEventHandler<HTMLInputElement> = (
151
- event,
152
- ) => {
153
- schemaExplorerState.setTargetDatabasePath(event.target.value);
154
- };
155
282
  const updateDatabase = applicationStore.guardUnhandledError(() =>
156
283
  flowResult(databaseBuilderState.updateDatabase()),
157
284
  );
@@ -166,17 +293,6 @@ export const DatabaseBuilderWizard = observer(
166
293
  schemaExplorerState.isUpdatingDatabase ||
167
294
  schemaExplorerState.previewDataState.isInProgress;
168
295
 
169
- useEffect(() => {
170
- flowResult(schemaExplorerState.fetchDatabaseMetadata()).catch(
171
- applicationStore.alertUnhandledError,
172
- );
173
- }, [applicationStore, schemaExplorerState]);
174
-
175
- useConditionedApplicationNavigationContext(
176
- LEGEND_STUDIO_APPLICATION_NAVIGATION_CONTEXT_KEY.DATABASE_BUILDER,
177
- databaseBuilderState.showModal,
178
- );
179
-
180
296
  return (
181
297
  <Dialog
182
298
  open={databaseBuilderState.showModal}
@@ -201,93 +317,9 @@ export const DatabaseBuilderWizard = observer(
201
317
  </button>
202
318
  </ModalHeaderActions>
203
319
  </ModalHeader>
204
- <ModalBody className="database-builder__content">
205
- <PanelLoadingIndicator isLoading={isExecutingAction} />
206
- <ResizablePanelGroup orientation="vertical">
207
- <ResizablePanel size={450}>
208
- <ResizablePanelGroup>
209
- <ResizablePanel>
210
- <div className="database-builder__config">
211
- <PanelHeader title="schema explorer" />
212
- <PanelContent className="database-builder__config__content">
213
- {schemaExplorerState.treeData && (
214
- <DatabaseSchemaExplorer
215
- treeData={schemaExplorerState.treeData}
216
- isReadOnly={false}
217
- schemaExplorerState={
218
- databaseBuilderState.schemaExplorerState
219
- }
220
- />
221
- )}
222
- </PanelContent>
223
- </div>
224
- </ResizablePanel>
225
- <ResizablePanelSplitter>
226
- <ResizablePanelSplitterLine
227
- color={'var(--color-dark-grey-250)'}
228
- />
229
- </ResizablePanelSplitter>
230
- <ResizablePanel>
231
- <div className="database-builder__config">
232
- <PanelHeader title="preview" />
233
- <PanelContent className="database-builder__config__content">
234
- {databaseBuilderState.schemaExplorerState.previewer && (
235
- <QueryBuilderGridResult
236
- executionResult={
237
- databaseBuilderState.schemaExplorerState.previewer
238
- }
239
- />
240
- )}
241
- </PanelContent>
242
- </div>
243
- </ResizablePanel>
244
- </ResizablePanelGroup>
245
- </ResizablePanel>
246
- <ResizablePanelSplitter />
247
- <ResizablePanel>
248
- <Panel className="database-builder__model">
249
- <PanelHeader title="database model" />
250
- <PanelContent>
251
- <div className="database-builder__modeler">
252
- <div className="panel__content__form__section database-builder__modeler__path">
253
- <div className="panel__content__form__section__header__label">
254
- Target Database Path
255
- </div>
256
- <InputWithInlineValidation
257
- className="panel__content__form__section__input"
258
- spellCheck={false}
259
- onChange={onTargetPathChange}
260
- disabled={!isCreatingNewDatabase}
261
- value={
262
- isCreatingNewDatabase
263
- ? schemaExplorerState.targetDatabasePath
264
- : schemaExplorerState.database.path
265
- }
266
- error={elementAlreadyExistsMessage}
267
- />
268
- </div>
269
- <div className="database-builder__modeler__preview">
270
- {databaseBuilderState.databaseGrammarCode && (
271
- <CodeEditor
272
- language={CODE_EDITOR_LANGUAGE.PURE}
273
- inputValue={
274
- databaseBuilderState.databaseGrammarCode
275
- }
276
- isReadOnly={true}
277
- />
278
- )}
279
- {!databaseBuilderState.databaseGrammarCode && (
280
- <BlankPanelContent>
281
- No database preview
282
- </BlankPanelContent>
283
- )}
284
- </div>
285
- </div>
286
- </PanelContent>
287
- </Panel>
288
- </ResizablePanel>
289
- </ResizablePanelGroup>
290
- </ModalBody>
320
+ <DatabaseBuilderModalContent
321
+ databaseBuilderState={databaseBuilderState}
322
+ />
291
323
  <ModalFooter>
292
324
  <ModalFooterButton
293
325
  className="database-builder__action--btn"
@@ -50,6 +50,95 @@ import {
50
50
  import { debounce, noop } from '@finos/legend-shared';
51
51
  import { isValidPath } from '@finos/legend-graph';
52
52
 
53
+ export const DatabaseModelPackageInput = observer(
54
+ (props: { databaseModelBuilderState: DatabaseModelBuilderState }) => {
55
+ const { databaseModelBuilderState } = props;
56
+
57
+ const applicationStore = useApplicationStore();
58
+ const debouncedRegenerate = useMemo(
59
+ () =>
60
+ debounce(
61
+ () => flowResult(databaseModelBuilderState.previewDatabaseModels()),
62
+ 500,
63
+ ),
64
+ [databaseModelBuilderState],
65
+ );
66
+
67
+ const changeTargetPackage: React.ChangeEventHandler<HTMLInputElement> = (
68
+ event,
69
+ ) => {
70
+ databaseModelBuilderState.setTargetPackage(event.target.value);
71
+ debouncedRegenerate()?.catch(applicationStore.alertUnhandledError);
72
+ };
73
+
74
+ const targetPackageValidationMessage =
75
+ !databaseModelBuilderState.targetPackage
76
+ ? `Target package path can't be empty`
77
+ : !isValidPath(databaseModelBuilderState.targetPackage)
78
+ ? 'Invalid target package path'
79
+ : undefined;
80
+
81
+ return (
82
+ <div className="panel__content__form__section">
83
+ <div className="panel__content__form__section__header__label">
84
+ Target Package
85
+ </div>
86
+ <div className="panel__content__form__section__header__prompt">
87
+ Target Package of Mapping and Models Generated
88
+ </div>
89
+ <InputWithInlineValidation
90
+ className="query-builder__variables__variable__name__input input-group__input"
91
+ spellCheck={false}
92
+ value={databaseModelBuilderState.targetPackage}
93
+ onChange={changeTargetPackage}
94
+ placeholder="Target package path"
95
+ error={targetPackageValidationMessage}
96
+ showEditableIcon={true}
97
+ />
98
+ </div>
99
+ );
100
+ },
101
+ );
102
+
103
+ export const DatabaseModelPreviewEditor = observer(
104
+ (props: {
105
+ databaseModelBuilderState: DatabaseModelBuilderState;
106
+ grammarCode: string;
107
+ }) => {
108
+ const { databaseModelBuilderState, grammarCode } = props;
109
+
110
+ const isExecutingAction =
111
+ databaseModelBuilderState.generatingModelState.isInProgress ||
112
+ databaseModelBuilderState.saveModelState.isInProgress;
113
+
114
+ return (
115
+ <Panel className="database-builder__model">
116
+ <PanelHeader title="database model" />
117
+ <PanelContent>
118
+ <PanelLoadingIndicator isLoading={isExecutingAction} />
119
+ <div className="database-builder__modeler">
120
+ <div className="database-builder__modeler__preview">
121
+ <div className="database-builder__modeler__preview__header">
122
+ readonly
123
+ </div>
124
+ {databaseModelBuilderState.generatedGrammarCode && (
125
+ <CodeEditor
126
+ language={CODE_EDITOR_LANGUAGE.PURE}
127
+ inputValue={grammarCode}
128
+ isReadOnly={true}
129
+ />
130
+ )}
131
+ {!databaseModelBuilderState.generatedGrammarCode && (
132
+ <BlankPanelContent>No model preview</BlankPanelContent>
133
+ )}
134
+ </div>
135
+ </div>
136
+ </PanelContent>
137
+ </Panel>
138
+ );
139
+ },
140
+ );
141
+
53
142
  export const DatabaseModelBuilder = observer(
54
143
  (props: {
55
144
  databaseModelBuilderState: DatabaseModelBuilderState;
@@ -66,6 +155,7 @@ export const DatabaseModelBuilder = observer(
66
155
  ),
67
156
  [databaseModelBuilderState],
68
157
  );
158
+
69
159
  const preview = (): void => {
70
160
  debouncedRegenerate.cancel();
71
161
  debouncedRegenerate()?.catch(applicationStore.alertUnhandledError);
@@ -78,19 +168,6 @@ export const DatabaseModelBuilder = observer(
78
168
  databaseModelBuilderState.close();
79
169
  };
80
170
 
81
- const targetPackageValidationMessage =
82
- !databaseModelBuilderState.targetPackage
83
- ? `Target package path can't be empty`
84
- : !isValidPath(databaseModelBuilderState.targetPackage)
85
- ? 'Invalid target package path'
86
- : undefined;
87
-
88
- const changeTargetPackage: React.ChangeEventHandler<HTMLInputElement> = (
89
- event,
90
- ) => {
91
- databaseModelBuilderState.setTargetPackage(event.target.value);
92
- debouncedRegenerate()?.catch(applicationStore.alertUnhandledError);
93
- };
94
171
  const isExecutingAction =
95
172
  databaseModelBuilderState.generatingModelState.isInProgress ||
96
173
  databaseModelBuilderState.saveModelState.isInProgress;
@@ -136,51 +213,18 @@ export const DatabaseModelBuilder = observer(
136
213
  <div className="database-builder__config">
137
214
  <PanelHeader title="schema explorer" />
138
215
  <PanelContent className="database-builder__config__content">
139
- <div className="panel__content__form__section">
140
- <div className="panel__content__form__section__header__label">
141
- {'Target Package'}
142
- </div>
143
- <div className="panel__content__form__section__header__prompt">
144
- {'Target Package of Mapping and Models Generated'}
145
- </div>
146
- <InputWithInlineValidation
147
- className="query-builder__variables__variable__name__input input-group__input"
148
- spellCheck={false}
149
- value={databaseModelBuilderState.targetPackage}
150
- onChange={changeTargetPackage}
151
- placeholder="Target package path"
152
- error={targetPackageValidationMessage}
153
- />
154
- </div>
216
+ <DatabaseModelPackageInput
217
+ databaseModelBuilderState={databaseModelBuilderState}
218
+ />
155
219
  </PanelContent>
156
220
  </div>
157
221
  </ResizablePanel>
158
222
  <ResizablePanelSplitter />
159
223
  <ResizablePanel>
160
- <Panel className="database-builder__model">
161
- <PanelHeader title="database model" />
162
- <PanelContent>
163
- <PanelLoadingIndicator isLoading={isExecutingAction} />
164
- <div className="database-builder__modeler">
165
- <div className="database-builder__modeler__preview">
166
- {databaseModelBuilderState.generatedGrammarCode && (
167
- <CodeEditor
168
- language={CODE_EDITOR_LANGUAGE.PURE}
169
- inputValue={
170
- databaseModelBuilderState.generatedGrammarCode
171
- }
172
- isReadOnly={true}
173
- />
174
- )}
175
- {!databaseModelBuilderState.generatedGrammarCode && (
176
- <BlankPanelContent>
177
- No model preview
178
- </BlankPanelContent>
179
- )}
180
- </div>
181
- </div>
182
- </PanelContent>
183
- </Panel>
224
+ <DatabaseModelPreviewEditor
225
+ databaseModelBuilderState={databaseModelBuilderState}
226
+ grammarCode={databaseModelBuilderState.generatedGrammarCode}
227
+ />
184
228
  </ResizablePanel>
185
229
  </ResizablePanelGroup>
186
230
  </ModalBody>
@@ -1567,12 +1567,13 @@ const renderAuthenticationStrategyEditor = (
1567
1567
  }
1568
1568
  };
1569
1569
 
1570
- const RelationalConnectionGeneralEditor = observer(
1570
+ export const RelationalConnectionGeneralEditor = observer(
1571
1571
  (props: {
1572
1572
  connectionValueState: RelationalDatabaseConnectionValueState;
1573
1573
  isReadOnly: boolean;
1574
+ hideHeader?: boolean;
1574
1575
  }) => {
1575
- const { connectionValueState, isReadOnly } = props;
1576
+ const { connectionValueState, isReadOnly, hideHeader } = props;
1576
1577
  const connection = connectionValueState.connection;
1577
1578
  const editorStore = useEditorStore();
1578
1579
  const plugins = editorStore.pluginManager.getApplicationPlugins();
@@ -1692,7 +1693,7 @@ const RelationalConnectionGeneralEditor = observer(
1692
1693
  <ResizablePanelGroup orientation="horizontal">
1693
1694
  <ResizablePanel size={200} minSize={15}>
1694
1695
  <Panel>
1695
- <PanelHeader title="general"></PanelHeader>
1696
+ {!hideHeader && <PanelHeader title="general"></PanelHeader>}
1696
1697
  <PanelContent className="relational-connection-editor__general">
1697
1698
  <PanelFormSection>
1698
1699
  <div className="panel__content__form__section__header__label">