@finos/legend-application-studio 28.9.0 → 28.10.1

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 (122) 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/components/ShowcaseManager.d.ts.map +1 -1
  6. package/lib/components/ShowcaseManager.js +5 -2
  7. package/lib/components/ShowcaseManager.js.map +1 -1
  8. package/lib/components/editor/ActivityBar.d.ts.map +1 -1
  9. package/lib/components/editor/ActivityBar.js +20 -17
  10. package/lib/components/editor/ActivityBar.js.map +1 -1
  11. package/lib/components/editor/editor-group/EditorGroup.d.ts.map +1 -1
  12. package/lib/components/editor/editor-group/EditorGroup.js +7 -1
  13. package/lib/components/editor/editor-group/EditorGroup.js.map +1 -1
  14. package/lib/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.d.ts +5 -0
  15. package/lib/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.d.ts.map +1 -1
  16. package/lib/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.js +29 -10
  17. package/lib/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.js.map +1 -1
  18. package/lib/components/editor/editor-group/connection-editor/DatabaseModelBuilder.d.ts +11 -0
  19. package/lib/components/editor/editor-group/connection-editor/DatabaseModelBuilder.d.ts.map +1 -1
  20. package/lib/components/editor/editor-group/connection-editor/DatabaseModelBuilder.js +22 -10
  21. package/lib/components/editor/editor-group/connection-editor/DatabaseModelBuilder.js.map +1 -1
  22. package/lib/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.d.ts +7 -0
  23. package/lib/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.d.ts.map +1 -1
  24. package/lib/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.js +3 -3
  25. package/lib/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.js.map +1 -1
  26. package/lib/components/editor/editor-group/end-to-end-flow-editor/ConnectionToQueryWorkflowEditor.d.ts +52 -0
  27. package/lib/components/editor/editor-group/end-to-end-flow-editor/ConnectionToQueryWorkflowEditor.d.ts.map +1 -0
  28. package/lib/components/editor/editor-group/end-to-end-flow-editor/ConnectionToQueryWorkflowEditor.js +150 -0
  29. package/lib/components/editor/editor-group/end-to-end-flow-editor/ConnectionToQueryWorkflowEditor.js.map +1 -0
  30. package/lib/components/editor/editor-group/service-editor/ServiceExecutionQueryEditor.js +1 -1
  31. package/lib/components/editor/editor-group/service-editor/ServiceExecutionQueryEditor.js.map +1 -1
  32. package/lib/components/editor/side-bar/Explorer.d.ts.map +1 -1
  33. package/lib/components/editor/side-bar/Explorer.js +6 -6
  34. package/lib/components/editor/side-bar/Explorer.js.map +1 -1
  35. package/lib/components/editor/side-bar/SideBar.d.ts.map +1 -1
  36. package/lib/components/editor/side-bar/SideBar.js +4 -1
  37. package/lib/components/editor/side-bar/SideBar.js.map +1 -1
  38. package/lib/components/editor/side-bar/end-to-end-workflow/EndToEndWorkflows.d.ts +23 -0
  39. package/lib/components/editor/side-bar/end-to-end-workflow/EndToEndWorkflows.d.ts.map +1 -0
  40. package/lib/components/editor/side-bar/end-to-end-workflow/EndToEndWorkflows.js +43 -0
  41. package/lib/components/editor/side-bar/end-to-end-workflow/EndToEndWorkflows.js.map +1 -0
  42. package/lib/index.css +2 -2
  43. package/lib/index.css.map +1 -1
  44. package/lib/package.json +1 -1
  45. package/lib/stores/ShowcaseManagerState.d.ts +1 -0
  46. package/lib/stores/ShowcaseManagerState.d.ts.map +1 -1
  47. package/lib/stores/ShowcaseManagerState.js +11 -1
  48. package/lib/stores/ShowcaseManagerState.js.map +1 -1
  49. package/lib/stores/editor/EditorConfig.d.ts +3 -1
  50. package/lib/stores/editor/EditorConfig.d.ts.map +1 -1
  51. package/lib/stores/editor/EditorConfig.js +4 -1
  52. package/lib/stores/editor/EditorConfig.js.map +1 -1
  53. package/lib/stores/editor/EditorStore.d.ts +3 -0
  54. package/lib/stores/editor/EditorStore.d.ts.map +1 -1
  55. package/lib/stores/editor/EditorStore.js +17 -0
  56. package/lib/stores/editor/EditorStore.js.map +1 -1
  57. package/lib/stores/editor/ExplorerTreeState.d.ts.map +1 -1
  58. package/lib/stores/editor/ExplorerTreeState.js +1 -1
  59. package/lib/stores/editor/ExplorerTreeState.js.map +1 -1
  60. package/lib/stores/editor/GraphEditGrammarModeState.d.ts.map +1 -1
  61. package/lib/stores/editor/GraphEditGrammarModeState.js.map +1 -1
  62. package/lib/stores/editor/NewElementState.d.ts +1 -0
  63. package/lib/stores/editor/NewElementState.d.ts.map +1 -1
  64. package/lib/stores/editor/NewElementState.js +1 -1
  65. package/lib/stores/editor/NewElementState.js.map +1 -1
  66. package/lib/stores/editor/editor-state/element-editor-state/ElementEditorState.d.ts.map +1 -1
  67. package/lib/stores/editor/editor-state/element-editor-state/ElementEditorState.js +2 -1
  68. package/lib/stores/editor/editor-state/element-editor-state/ElementEditorState.js.map +1 -1
  69. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.d.ts +6 -2
  70. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.d.ts.map +1 -1
  71. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.js +53 -34
  72. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.js.map +1 -1
  73. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.d.ts.map +1 -1
  74. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.js +1 -1
  75. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.js.map +1 -1
  76. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseModelBuilderState.d.ts +3 -2
  77. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseModelBuilderState.d.ts.map +1 -1
  78. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseModelBuilderState.js +8 -5
  79. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseModelBuilderState.js.map +1 -1
  80. package/lib/stores/editor/editor-state/end-to-end-workflow-state/EndToEndWorkflowEditorState.d.ts +22 -0
  81. package/lib/stores/editor/editor-state/end-to-end-workflow-state/EndToEndWorkflowEditorState.d.ts.map +1 -0
  82. package/lib/stores/editor/editor-state/end-to-end-workflow-state/EndToEndWorkflowEditorState.js +23 -0
  83. package/lib/stores/editor/editor-state/end-to-end-workflow-state/EndToEndWorkflowEditorState.js.map +1 -0
  84. package/lib/stores/editor/editor-state/end-to-end-workflow-state/QueryConnectionEndToEndWorkflowEditorState.d.ts +111 -0
  85. package/lib/stores/editor/editor-state/end-to-end-workflow-state/QueryConnectionEndToEndWorkflowEditorState.d.ts.map +1 -0
  86. package/lib/stores/editor/editor-state/end-to-end-workflow-state/QueryConnectionEndToEndWorkflowEditorState.js +453 -0
  87. package/lib/stores/editor/editor-state/end-to-end-workflow-state/QueryConnectionEndToEndWorkflowEditorState.js.map +1 -0
  88. package/lib/stores/editor/sidebar-state/end-to-end-workflow/GlobalEndToEndFlowState.d.ts +24 -0
  89. package/lib/stores/editor/sidebar-state/end-to-end-workflow/GlobalEndToEndFlowState.d.ts.map +1 -0
  90. package/lib/stores/editor/sidebar-state/end-to-end-workflow/GlobalEndToEndFlowState.js +37 -0
  91. package/lib/stores/editor/sidebar-state/end-to-end-workflow/GlobalEndToEndFlowState.js.map +1 -0
  92. package/lib/stores/showcase/ShowcaseViewerStore.d.ts.map +1 -1
  93. package/lib/stores/showcase/ShowcaseViewerStore.js +5 -1
  94. package/lib/stores/showcase/ShowcaseViewerStore.js.map +1 -1
  95. package/package.json +5 -5
  96. package/src/__lib__/LegendStudioCommand.ts +5 -0
  97. package/src/components/ShowcaseManager.tsx +18 -0
  98. package/src/components/editor/ActivityBar.tsx +56 -15
  99. package/src/components/editor/editor-group/EditorGroup.tsx +21 -1
  100. package/src/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.tsx +136 -103
  101. package/src/components/editor/editor-group/connection-editor/DatabaseModelBuilder.tsx +97 -53
  102. package/src/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.tsx +4 -3
  103. package/src/components/editor/editor-group/end-to-end-flow-editor/ConnectionToQueryWorkflowEditor.tsx +518 -0
  104. package/src/components/editor/editor-group/service-editor/ServiceExecutionQueryEditor.tsx +1 -1
  105. package/src/components/editor/side-bar/Explorer.tsx +7 -6
  106. package/src/components/editor/side-bar/SideBar.tsx +13 -1
  107. package/src/components/editor/side-bar/end-to-end-workflow/EndToEndWorkflows.tsx +102 -0
  108. package/src/stores/ShowcaseManagerState.ts +19 -1
  109. package/src/stores/editor/EditorConfig.ts +3 -0
  110. package/src/stores/editor/EditorStore.ts +21 -0
  111. package/src/stores/editor/ExplorerTreeState.ts +1 -0
  112. package/src/stores/editor/GraphEditGrammarModeState.ts +3 -3
  113. package/src/stores/editor/NewElementState.ts +1 -1
  114. package/src/stores/editor/editor-state/element-editor-state/ElementEditorState.ts +2 -1
  115. package/src/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.ts +77 -49
  116. package/src/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.ts +1 -2
  117. package/src/stores/editor/editor-state/element-editor-state/connection/DatabaseModelBuilderState.ts +12 -8
  118. package/src/stores/editor/editor-state/end-to-end-workflow-state/EndToEndWorkflowEditorState.ts +23 -0
  119. package/src/stores/editor/editor-state/end-to-end-workflow-state/QueryConnectionEndToEndWorkflowEditorState.ts +775 -0
  120. package/src/stores/editor/sidebar-state/end-to-end-workflow/GlobalEndToEndFlowState.ts +43 -0
  121. package/src/stores/showcase/ShowcaseViewerStore.ts +4 -0
  122. package/tsconfig.json +5 -0
@@ -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">
@@ -0,0 +1,518 @@
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 {
18
+ ResizablePanelGroup,
19
+ ResizablePanel,
20
+ Panel,
21
+ BaseStepper,
22
+ PanelContent,
23
+ Modal,
24
+ ModalBody,
25
+ InputWithInlineValidation,
26
+ PanelHeader,
27
+ PanelLoadingIndicator,
28
+ ResizablePanelSplitter,
29
+ EyeIcon,
30
+ BlankPanelContent,
31
+ } from '@finos/legend-art';
32
+ import { observer } from 'mobx-react-lite';
33
+ import { useEffect, useMemo } from 'react';
34
+ import { RelationalConnectionGeneralEditor } from '../connection-editor/RelationalDatabaseConnectionEditor.js';
35
+ import { flowResult } from 'mobx';
36
+ import { useApplicationStore } from '@finos/legend-application';
37
+ import { DatabaseBuilderModalContent } from '../connection-editor/DatabaseBuilderWizard.js';
38
+ import { debounce, guaranteeNonNullable } from '@finos/legend-shared';
39
+ import {
40
+ CODE_EDITOR_LANGUAGE,
41
+ CodeEditor,
42
+ } from '@finos/legend-lego/code-editor';
43
+ import type { DatabaseBuilderWizardState } from '../../../../stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.js';
44
+ import {
45
+ DatabaseModelPackageInput,
46
+ DatabaseModelPreviewEditor,
47
+ } from '../connection-editor/DatabaseModelBuilder.js';
48
+ import {
49
+ ConnectionValueStepperState,
50
+ DatabaseBuilderStepperState,
51
+ DatabaseGrammarEditorStepperState,
52
+ DatabaseModelBuilderStepperState,
53
+ QUERY_CONNECTION_WORKFLOW_STEPS,
54
+ QueryConnectionConfirmationAndGrammarEditorStepperState,
55
+ type QueryConnectionEndToEndWorkflowEditorState,
56
+ } from '../../../../stores/editor/editor-state/end-to-end-workflow-state/QueryConnectionEndToEndWorkflowEditorState.js';
57
+
58
+ export const QueryConnectionRelationalConnectionEditor = observer(
59
+ (props: {
60
+ queryConnectionEndToEndWorkflowState: QueryConnectionEndToEndWorkflowEditorState;
61
+ connectionValueStepperState: ConnectionValueStepperState;
62
+ }) => {
63
+ const {
64
+ queryConnectionEndToEndWorkflowState,
65
+ connectionValueStepperState,
66
+ } = props;
67
+ const elementAlreadyExistsMessage =
68
+ queryConnectionEndToEndWorkflowState.editorStore.graphManagerState.graph.allElements
69
+ .map((s) => s.path)
70
+ .includes(connectionValueStepperState.targetConnectionPath)
71
+ ? 'Element with same path already exists'
72
+ : undefined;
73
+ const onTargetPathChange: React.ChangeEventHandler<HTMLInputElement> = (
74
+ event,
75
+ ) => {
76
+ connectionValueStepperState.setTargetConnectionPath(event.target.value);
77
+ };
78
+
79
+ return (
80
+ <Panel className="query-connection-workflow-panel query-connection-relational-connection-editor">
81
+ <PanelHeader title="build a connection" />
82
+ <PanelContent>
83
+ <div className="query-connection-relational-connection-editor__connection-builder">
84
+ <div className="panel__content__form__section query-connection-relational-connection-editor__connection-builder__path">
85
+ <div className="panel__content__form__section__header__label">
86
+ Target Connection Path
87
+ </div>
88
+ <InputWithInlineValidation
89
+ className="panel__content__form__section__input"
90
+ spellCheck={false}
91
+ onChange={onTargetPathChange}
92
+ value={connectionValueStepperState.targetConnectionPath}
93
+ error={elementAlreadyExistsMessage}
94
+ showEditableIcon={true}
95
+ />
96
+ </div>
97
+ <div className="query-connection-relational-connection-editor__editor">
98
+ <RelationalConnectionGeneralEditor
99
+ connectionValueState={
100
+ connectionValueStepperState.connectionValueState
101
+ }
102
+ isReadOnly={false}
103
+ hideHeader={true}
104
+ />
105
+ </div>
106
+ </div>
107
+ </PanelContent>
108
+ </Panel>
109
+ );
110
+ },
111
+ );
112
+
113
+ export const QueryConnectionDatabaseBuilderEditor = observer(
114
+ (props: { databaseBuilderState: DatabaseBuilderWizardState }) => {
115
+ const { databaseBuilderState } = props;
116
+ const applicationStore = useApplicationStore();
117
+ const preview = applicationStore.guardUnhandledError(() =>
118
+ flowResult(databaseBuilderState.previewDatabaseModel()),
119
+ );
120
+
121
+ return (
122
+ <Panel className="query-connection-workflow-panel query-connection-database-builder-editor">
123
+ <div className="query-connection-workflow-panel query-connection-database-builder-editor__header">
124
+ <PanelHeader title="Database Builder" />
125
+ <button
126
+ className="query-connection-workflow-panel query-connection-database-builder-editor__header__action"
127
+ onClick={preview}
128
+ title="Preview database..."
129
+ >
130
+ <EyeIcon className="query-connection-database-builder-editor__header__action__icon" />
131
+ <div className="query-connection-database-builder-editor__header__action__label">
132
+ Preview
133
+ </div>
134
+ </button>
135
+ </div>
136
+ <Modal
137
+ darkMode={true}
138
+ className="query-connection-database-builder-editor__modal"
139
+ >
140
+ <div className="query-connection-database-builder-editor__modal__content">
141
+ <DatabaseBuilderModalContent
142
+ databaseBuilderState={databaseBuilderState}
143
+ />
144
+ </div>
145
+ </Modal>
146
+ </Panel>
147
+ );
148
+ },
149
+ );
150
+
151
+ export const QueryConnectionDatabaseGrammarEditor = observer(
152
+ (props: {
153
+ queryConnectionEndToEndWorkflowState: QueryConnectionEndToEndWorkflowEditorState;
154
+ databaseGrammarEditorStepperState: DatabaseGrammarEditorStepperState;
155
+ }) => {
156
+ const {
157
+ queryConnectionEndToEndWorkflowState,
158
+ databaseGrammarEditorStepperState,
159
+ } = props;
160
+ const applicationStore = useApplicationStore();
161
+
162
+ const compile = (): void => {
163
+ flowResult(
164
+ databaseGrammarEditorStepperState.compileDatabaseGrammarCode(),
165
+ ).catch(applicationStore.alertUnhandledError);
166
+ };
167
+
168
+ const updateDatabaseGrammar = (val: string): void => {
169
+ queryConnectionEndToEndWorkflowState.setDatabaseGrammarCode(val);
170
+ };
171
+
172
+ return (
173
+ <Panel className="query-connection-workflow-panel query-connection-database-builder-editor">
174
+ <div className="query-connection-workflow-panel query-connection-database-builder-editor__header">
175
+ <PanelHeader title="Database Editor" />
176
+ <button
177
+ className="query-connection-workflow-panel query-connection-database-builder-editor__header__action"
178
+ onClick={compile}
179
+ title="Compile database model..."
180
+ >
181
+ Compile
182
+ </button>
183
+ </div>
184
+ <PanelLoadingIndicator
185
+ isLoading={
186
+ databaseGrammarEditorStepperState.isCompilingGrammarCode
187
+ .isInProgress
188
+ }
189
+ />
190
+ <div className="panel__content__form__section__header__prompt query-connection-database-builder-editor__prompt">
191
+ Joins could be added manually and please be aware that only one
192
+ database is supported in this flow
193
+ </div>
194
+ <div className="query-connection-database-builder-editor__editor">
195
+ <CodeEditor
196
+ inputValue={
197
+ queryConnectionEndToEndWorkflowState.databaseGrammarCode
198
+ }
199
+ updateInput={updateDatabaseGrammar}
200
+ language={CODE_EDITOR_LANGUAGE.PURE}
201
+ error={queryConnectionEndToEndWorkflowState.compileError}
202
+ />
203
+ </div>
204
+ </Panel>
205
+ );
206
+ },
207
+ );
208
+
209
+ export const QueryConnectionModelsEditor = observer(
210
+ (props: {
211
+ databaseModelBuilderStepperState: DatabaseModelBuilderStepperState;
212
+ queryConnectionEndToEndWorkflowState: QueryConnectionEndToEndWorkflowEditorState;
213
+ }) => {
214
+ const {
215
+ databaseModelBuilderStepperState,
216
+ queryConnectionEndToEndWorkflowState,
217
+ } = props;
218
+ const applicationStore = useApplicationStore();
219
+
220
+ const runtimeElementAlreadyExistsMessage =
221
+ queryConnectionEndToEndWorkflowState.editorStore.graphManagerState.graph.allElements
222
+ .map((s) => s.path)
223
+ .includes(queryConnectionEndToEndWorkflowState.targetRuntimePath)
224
+ ? 'Element with same path already exists or must contain ::'
225
+ : undefined;
226
+
227
+ const debouncedRegenerateRuntime = useMemo(
228
+ () =>
229
+ debounce(
230
+ (val: string) => {
231
+ if (val !== '') {
232
+ queryConnectionEndToEndWorkflowState.updateRuntime(val);
233
+ }
234
+ },
235
+
236
+ 500,
237
+ ),
238
+ [queryConnectionEndToEndWorkflowState],
239
+ );
240
+
241
+ const changeTargetRuntimePackage: React.ChangeEventHandler<
242
+ HTMLInputElement
243
+ > = (event) => {
244
+ queryConnectionEndToEndWorkflowState.setTargetRuntimePath(
245
+ event.target.value,
246
+ );
247
+ debouncedRegenerateRuntime(event.target.value);
248
+ };
249
+
250
+ useEffect(() => {
251
+ flowResult(
252
+ databaseModelBuilderStepperState.databaseModelBuilderState.previewDatabaseModels(),
253
+ )
254
+ .then(() =>
255
+ databaseModelBuilderStepperState.updateGraphWithModels(
256
+ guaranteeNonNullable(
257
+ databaseModelBuilderStepperState.databaseModelBuilderState
258
+ .entities,
259
+ ),
260
+ ),
261
+ )
262
+ .catch(applicationStore.alertUnhandledError);
263
+ }, [
264
+ applicationStore,
265
+ databaseModelBuilderStepperState,
266
+ databaseModelBuilderStepperState.databaseModelBuilderState,
267
+ databaseModelBuilderStepperState.databaseModelBuilderState.targetPackage,
268
+ queryConnectionEndToEndWorkflowState,
269
+ ]);
270
+
271
+ return (
272
+ <Panel className="query-connection-workflow-panel query-connection-database-builder-editor">
273
+ <div className="query-connection-workflow-panel query-connection-database-builder-editor__header">
274
+ <PanelHeader title="Model Builder" />
275
+ </div>
276
+ <Modal
277
+ darkMode={true}
278
+ className="query-connection-connection-model-editor__modal"
279
+ >
280
+ <div className="query-connection-connection-model-editor__modal">
281
+ <ModalBody className="database-builder__content">
282
+ <ResizablePanelGroup orientation="vertical">
283
+ <ResizablePanel size={450}>
284
+ <div className="database-builder__config">
285
+ <PanelHeader title="schema explorer" />
286
+ <PanelContent className="database-builder__config__content">
287
+ <DatabaseModelPackageInput
288
+ databaseModelBuilderState={
289
+ databaseModelBuilderStepperState.databaseModelBuilderState
290
+ }
291
+ />
292
+ <div className="panel__content__form__section">
293
+ <div className="panel__content__form__section__header__label">
294
+ Target Runtime Path
295
+ </div>
296
+ <div className="panel__content__form__section__header__prompt">
297
+ Target path for runtime
298
+ </div>
299
+ <InputWithInlineValidation
300
+ className="query-builder__variables__variable__name__input input-group__input"
301
+ spellCheck={false}
302
+ value={
303
+ queryConnectionEndToEndWorkflowState.targetRuntimePath
304
+ }
305
+ onChange={changeTargetRuntimePackage}
306
+ placeholder="Target Runtime path"
307
+ error={runtimeElementAlreadyExistsMessage}
308
+ showEditableIcon={true}
309
+ />
310
+ </div>
311
+ </PanelContent>
312
+ </div>
313
+ </ResizablePanel>
314
+ <ResizablePanelSplitter />
315
+ <ResizablePanel>
316
+ <DatabaseModelPreviewEditor
317
+ databaseModelBuilderState={
318
+ databaseModelBuilderStepperState.databaseModelBuilderState
319
+ }
320
+ grammarCode={databaseModelBuilderStepperState.databaseModelBuilderState.generatedGrammarCode.concat(
321
+ queryConnectionEndToEndWorkflowState.runtimeGrammarCode,
322
+ )}
323
+ />
324
+ </ResizablePanel>
325
+ </ResizablePanelGroup>
326
+ </ModalBody>
327
+ </div>
328
+ </Modal>
329
+ </Panel>
330
+ );
331
+ },
332
+ );
333
+
334
+ export const QueryConnectionConfirmationAndGrammarEditor = observer(
335
+ (props: {
336
+ queryConnectionEndToEndWorkflowState: QueryConnectionEndToEndWorkflowEditorState;
337
+ queryConnectionConfirmationAndGrammarEditorStepperState: QueryConnectionConfirmationAndGrammarEditorStepperState;
338
+ }) => {
339
+ const {
340
+ queryConnectionEndToEndWorkflowState,
341
+ queryConnectionConfirmationAndGrammarEditorStepperState,
342
+ } = props;
343
+ const applicationStore = useApplicationStore();
344
+
345
+ const compile = (): void => {
346
+ flowResult(
347
+ queryConnectionConfirmationAndGrammarEditorStepperState.compile(),
348
+ ).catch(applicationStore.alertUnhandledError);
349
+ };
350
+
351
+ const updateInput = (val: string): void => {
352
+ queryConnectionEndToEndWorkflowState.setFinalGrammarCode(val);
353
+ };
354
+
355
+ return (
356
+ <Panel className="query-connection-workflow-panel query-connection-database-builder-editor">
357
+ <div className="query-connection-workflow-panel query-connection-database-builder-editor__header">
358
+ <PanelHeader title="Database Editor" />
359
+ <button
360
+ className="query-connection-workflow-panel query-connection-database-builder-editor__header__action"
361
+ onClick={compile}
362
+ title="Compile model..."
363
+ >
364
+ Compile
365
+ </button>
366
+ </div>
367
+ <PanelLoadingIndicator
368
+ isLoading={
369
+ queryConnectionConfirmationAndGrammarEditorStepperState
370
+ .isCompilingCode.isInProgress
371
+ }
372
+ />
373
+ <div className="panel__content__form__section__header__prompt query-connection-database-builder-editor__prompt">
374
+ Please confirm models below will be added to the project and click
375
+ query to open query builder
376
+ </div>
377
+ <div className="query-connection-database-builder-editor__editor">
378
+ <CodeEditor
379
+ inputValue={queryConnectionEndToEndWorkflowState.finalGrammarCode}
380
+ updateInput={updateInput}
381
+ language={CODE_EDITOR_LANGUAGE.PURE}
382
+ error={queryConnectionEndToEndWorkflowState.compileError}
383
+ />
384
+ </div>
385
+ </Panel>
386
+ );
387
+ },
388
+ );
389
+
390
+ export const QueryConnectionWorflowEditor = observer(
391
+ (props: {
392
+ connectionToQueryWorkflowState: QueryConnectionEndToEndWorkflowEditorState;
393
+ }) => {
394
+ const { connectionToQueryWorkflowState } = props;
395
+ const applicationStore = useApplicationStore();
396
+ const stepLabel = connectionToQueryWorkflowState.activeStepToStepLabel.get(
397
+ connectionToQueryWorkflowState.activeStep,
398
+ );
399
+ const increaseActiveStep = (): void => {
400
+ if (connectionToQueryWorkflowState.isValid) {
401
+ connectionToQueryWorkflowState.setActiveStep(
402
+ connectionToQueryWorkflowState.activeStep + 1,
403
+ );
404
+ }
405
+ };
406
+ const handleNext = (): void => {
407
+ if (stepLabel) {
408
+ flowResult(
409
+ connectionToQueryWorkflowState.activeStepToBaseStepperState
410
+ .get(stepLabel)
411
+ ?.handleNext(),
412
+ )
413
+ .then(() => increaseActiveStep())
414
+ .catch(applicationStore.alertUnhandledError);
415
+ }
416
+ };
417
+ const handleBack = (): void => {
418
+ connectionToQueryWorkflowState.setCompileError(undefined);
419
+ connectionToQueryWorkflowState.setActiveStep(
420
+ connectionToQueryWorkflowState.activeStep - 1,
421
+ );
422
+ };
423
+
424
+ const renderStepContent = (): React.ReactNode => {
425
+ if (stepLabel) {
426
+ const currentState =
427
+ connectionToQueryWorkflowState.activeStepToBaseStepperState.get(
428
+ stepLabel,
429
+ );
430
+ if (currentState instanceof ConnectionValueStepperState) {
431
+ return (
432
+ <QueryConnectionRelationalConnectionEditor
433
+ queryConnectionEndToEndWorkflowState={
434
+ currentState.workflowEditorState
435
+ }
436
+ connectionValueStepperState={currentState}
437
+ />
438
+ );
439
+ } else if (currentState instanceof DatabaseBuilderStepperState) {
440
+ return (
441
+ <QueryConnectionDatabaseBuilderEditor
442
+ databaseBuilderState={currentState.databaseBuilderWizardState}
443
+ />
444
+ );
445
+ } else if (currentState instanceof DatabaseGrammarEditorStepperState) {
446
+ return (
447
+ <QueryConnectionDatabaseGrammarEditor
448
+ queryConnectionEndToEndWorkflowState={
449
+ currentState.workflowEditorState
450
+ }
451
+ databaseGrammarEditorStepperState={currentState}
452
+ />
453
+ );
454
+ } else if (currentState instanceof DatabaseModelBuilderStepperState) {
455
+ return (
456
+ <QueryConnectionModelsEditor
457
+ databaseModelBuilderStepperState={currentState}
458
+ queryConnectionEndToEndWorkflowState={
459
+ currentState.workflowEditorState
460
+ }
461
+ />
462
+ );
463
+ } else if (
464
+ currentState instanceof
465
+ QueryConnectionConfirmationAndGrammarEditorStepperState
466
+ ) {
467
+ return (
468
+ <QueryConnectionConfirmationAndGrammarEditor
469
+ queryConnectionEndToEndWorkflowState={
470
+ currentState.workflowEditorState
471
+ }
472
+ queryConnectionConfirmationAndGrammarEditorStepperState={
473
+ currentState
474
+ }
475
+ />
476
+ );
477
+ }
478
+ }
479
+ return <BlankPanelContent> </BlankPanelContent>;
480
+ };
481
+ return (
482
+ <div>
483
+ <Panel>
484
+ <PanelContent className="test-runner-panel__result">
485
+ <BaseStepper
486
+ steps={Object.values(QUERY_CONNECTION_WORKFLOW_STEPS)}
487
+ activeStep={connectionToQueryWorkflowState.activeStep}
488
+ ></BaseStepper>
489
+ <PanelContent>
490
+ <div className="query-connection-workflow__content">
491
+ {renderStepContent()}
492
+ </div>
493
+ </PanelContent>
494
+ </PanelContent>
495
+ <div className="query-connection-workflow__actions">
496
+ <button
497
+ className="query-connection-workflow__actions__action-btn"
498
+ disabled={connectionToQueryWorkflowState.activeStep === 0}
499
+ onClick={handleBack}
500
+ title="Go to previous step..."
501
+ >
502
+ Back
503
+ </button>
504
+ <button
505
+ className="query-connection-workflow__actions__action-btn query-connection-workflow__actions__action-btn--primary"
506
+ onClick={handleNext}
507
+ >
508
+ {connectionToQueryWorkflowState.activeStep ===
509
+ Object.values(QUERY_CONNECTION_WORKFLOW_STEPS).length - 1
510
+ ? 'Import And Query'
511
+ : 'Next'}
512
+ </button>
513
+ </div>
514
+ </Panel>
515
+ </div>
516
+ );
517
+ },
518
+ );
@@ -523,7 +523,7 @@ export const queryService = async (
523
523
  <button
524
524
  className="query-builder__dialog__header__custom-action"
525
525
  tabIndex={-1}
526
- disabled={editorStore.isInViewerMode}
526
+ disabled={editorStore.disableGraphEditing}
527
527
  onClick={save}
528
528
  >
529
529
  Save Query
@@ -496,7 +496,8 @@ const ExplorerContextMenu = observer(
496
496
  })
497
497
  .filter(isNonNullable);
498
498
  const projectId = editorStore.sdlcState.currentProject?.projectId;
499
- const isReadOnly = editorStore.isInViewerMode || Boolean(nodeIsImmutable);
499
+ const isReadOnly =
500
+ editorStore.disableGraphEditing || Boolean(nodeIsImmutable);
500
501
  const isDependencyProjectElement =
501
502
  node && isDependencyElement(node.packageableElement);
502
503
  const _package = node
@@ -578,7 +579,7 @@ const ExplorerContextMenu = observer(
578
579
  handler: () => {
579
580
  editorStore.explorerTreeState.buildDatabaseModels(
580
581
  database,
581
- editorStore.isInViewerMode,
582
+ editorStore.disableGraphEditing,
582
583
  );
583
584
  },
584
585
  },
@@ -592,7 +593,7 @@ const ExplorerContextMenu = observer(
592
593
  } else {
593
594
  editorStore.explorerTreeState.buildDatabaseModels(
594
595
  database,
595
- editorStore.isInViewerMode,
596
+ editorStore.disableGraphEditing,
596
597
  );
597
598
  }
598
599
  }
@@ -1142,7 +1143,7 @@ const ExplorerDropdownMenu = observer(() => {
1142
1143
 
1143
1144
  const ExplorerTrees = observer(() => {
1144
1145
  const editorStore = useEditorStore();
1145
- const { isInViewerMode } = editorStore;
1146
+ const { disableGraphEditing } = editorStore;
1146
1147
  const isInGrammarTextMode =
1147
1148
  editorStore.graphEditorMode.mode === GRAPH_EDITOR_MODE.GRAMMAR_TEXT;
1148
1149
  const openModelImport = (): void =>
@@ -1224,7 +1225,7 @@ const ExplorerTrees = observer(() => {
1224
1225
  return (
1225
1226
  <ContextMenu
1226
1227
  className="explorer__content"
1227
- disabled={isInGrammarTextMode || isInViewerMode}
1228
+ disabled={isInGrammarTextMode || disableGraphEditing}
1228
1229
  content={<ExplorerContextMenu />}
1229
1230
  menuProps={{ elevation: 7 }}
1230
1231
  >
@@ -1396,7 +1397,7 @@ const ProjectExplorerActionPanel = observer((props: { disabled: boolean }) => {
1396
1397
  <SettingsEthernetIcon />
1397
1398
  </button>
1398
1399
  )}
1399
- {!editorStore.isInViewerMode && (
1400
+ {!editorStore.disableGraphEditing && (
1400
1401
  <DropdownMenu
1401
1402
  className="panel__header__action"
1402
1403
  title="New Element... (Ctrl + Shift + N)"
@@ -15,7 +15,10 @@
15
15
  */
16
16
 
17
17
  import { observer } from 'mobx-react-lite';
18
- import { ACTIVITY_MODE } from '../../../stores/editor/EditorConfig.js';
18
+ import {
19
+ ACTIVITY_MODE,
20
+ USER_JOURNEYS,
21
+ } from '../../../stores/editor/EditorConfig.js';
19
22
  import { Explorer } from './Explorer.js';
20
23
  import { LocalChanges } from './LocalChanges.js';
21
24
  import { WorkspaceReview } from './WorkspaceReview.js';
@@ -26,6 +29,7 @@ import { WorkflowManager } from './WorkflowManager.js';
26
29
  import { useEditorStore } from '../EditorStoreProvider.js';
27
30
  import { GlobalTestRunner } from './testable/GlobalTestRunner.js';
28
31
  import { RegisterService } from './RegisterService.js';
32
+ import { EndToEndWorkflow } from './end-to-end-workflow/EndToEndWorkflows.js';
29
33
 
30
34
  /**
31
35
  * Wrapper component around different implementations of sidebar, such as to view domain, to manage SDLC, etc.
@@ -67,6 +71,14 @@ export const SideBar = observer(() => {
67
71
  }
68
72
  />
69
73
  );
74
+ case USER_JOURNEYS.END_TO_END_WORKFLOWS:
75
+ return (
76
+ <EndToEndWorkflow
77
+ globalEndToEndWorkflowState={
78
+ editorStore.globalEndToEndWorkflowState
79
+ }
80
+ />
81
+ );
70
82
  default:
71
83
  return null;
72
84
  }