@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.
- package/lib/__lib__/LegendStudioCommand.d.ts +1 -0
- package/lib/__lib__/LegendStudioCommand.d.ts.map +1 -1
- package/lib/__lib__/LegendStudioCommand.js +5 -0
- package/lib/__lib__/LegendStudioCommand.js.map +1 -1
- package/lib/components/ShowcaseManager.d.ts.map +1 -1
- package/lib/components/ShowcaseManager.js +5 -2
- package/lib/components/ShowcaseManager.js.map +1 -1
- package/lib/components/editor/ActivityBar.d.ts.map +1 -1
- package/lib/components/editor/ActivityBar.js +20 -17
- package/lib/components/editor/ActivityBar.js.map +1 -1
- package/lib/components/editor/editor-group/EditorGroup.d.ts.map +1 -1
- package/lib/components/editor/editor-group/EditorGroup.js +7 -1
- package/lib/components/editor/editor-group/EditorGroup.js.map +1 -1
- package/lib/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.d.ts +5 -0
- package/lib/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.d.ts.map +1 -1
- package/lib/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.js +29 -10
- package/lib/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.js.map +1 -1
- package/lib/components/editor/editor-group/connection-editor/DatabaseModelBuilder.d.ts +11 -0
- package/lib/components/editor/editor-group/connection-editor/DatabaseModelBuilder.d.ts.map +1 -1
- package/lib/components/editor/editor-group/connection-editor/DatabaseModelBuilder.js +22 -10
- package/lib/components/editor/editor-group/connection-editor/DatabaseModelBuilder.js.map +1 -1
- package/lib/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.d.ts +7 -0
- package/lib/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.d.ts.map +1 -1
- package/lib/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.js +3 -3
- package/lib/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.js.map +1 -1
- package/lib/components/editor/editor-group/end-to-end-flow-editor/ConnectionToQueryWorkflowEditor.d.ts +52 -0
- package/lib/components/editor/editor-group/end-to-end-flow-editor/ConnectionToQueryWorkflowEditor.d.ts.map +1 -0
- package/lib/components/editor/editor-group/end-to-end-flow-editor/ConnectionToQueryWorkflowEditor.js +150 -0
- package/lib/components/editor/editor-group/end-to-end-flow-editor/ConnectionToQueryWorkflowEditor.js.map +1 -0
- package/lib/components/editor/editor-group/service-editor/ServiceExecutionQueryEditor.js +1 -1
- package/lib/components/editor/editor-group/service-editor/ServiceExecutionQueryEditor.js.map +1 -1
- package/lib/components/editor/side-bar/Explorer.d.ts.map +1 -1
- package/lib/components/editor/side-bar/Explorer.js +6 -6
- package/lib/components/editor/side-bar/Explorer.js.map +1 -1
- package/lib/components/editor/side-bar/SideBar.d.ts.map +1 -1
- package/lib/components/editor/side-bar/SideBar.js +4 -1
- package/lib/components/editor/side-bar/SideBar.js.map +1 -1
- package/lib/components/editor/side-bar/end-to-end-workflow/EndToEndWorkflows.d.ts +23 -0
- package/lib/components/editor/side-bar/end-to-end-workflow/EndToEndWorkflows.d.ts.map +1 -0
- package/lib/components/editor/side-bar/end-to-end-workflow/EndToEndWorkflows.js +43 -0
- package/lib/components/editor/side-bar/end-to-end-workflow/EndToEndWorkflows.js.map +1 -0
- package/lib/index.css +2 -2
- package/lib/index.css.map +1 -1
- package/lib/package.json +1 -1
- package/lib/stores/ShowcaseManagerState.d.ts +1 -0
- package/lib/stores/ShowcaseManagerState.d.ts.map +1 -1
- package/lib/stores/ShowcaseManagerState.js +11 -1
- package/lib/stores/ShowcaseManagerState.js.map +1 -1
- package/lib/stores/editor/EditorConfig.d.ts +3 -1
- package/lib/stores/editor/EditorConfig.d.ts.map +1 -1
- package/lib/stores/editor/EditorConfig.js +4 -1
- package/lib/stores/editor/EditorConfig.js.map +1 -1
- package/lib/stores/editor/EditorStore.d.ts +3 -0
- package/lib/stores/editor/EditorStore.d.ts.map +1 -1
- package/lib/stores/editor/EditorStore.js +17 -0
- package/lib/stores/editor/EditorStore.js.map +1 -1
- package/lib/stores/editor/ExplorerTreeState.d.ts.map +1 -1
- package/lib/stores/editor/ExplorerTreeState.js +1 -1
- package/lib/stores/editor/ExplorerTreeState.js.map +1 -1
- package/lib/stores/editor/GraphEditGrammarModeState.d.ts.map +1 -1
- package/lib/stores/editor/GraphEditGrammarModeState.js.map +1 -1
- package/lib/stores/editor/NewElementState.d.ts +1 -0
- package/lib/stores/editor/NewElementState.d.ts.map +1 -1
- package/lib/stores/editor/NewElementState.js +1 -1
- package/lib/stores/editor/NewElementState.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/ElementEditorState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/ElementEditorState.js +2 -1
- package/lib/stores/editor/editor-state/element-editor-state/ElementEditorState.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.d.ts +6 -2
- package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.js +53 -34
- package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.js +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseModelBuilderState.d.ts +3 -2
- package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseModelBuilderState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseModelBuilderState.js +8 -5
- package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseModelBuilderState.js.map +1 -1
- package/lib/stores/editor/editor-state/end-to-end-workflow-state/EndToEndWorkflowEditorState.d.ts +22 -0
- package/lib/stores/editor/editor-state/end-to-end-workflow-state/EndToEndWorkflowEditorState.d.ts.map +1 -0
- package/lib/stores/editor/editor-state/end-to-end-workflow-state/EndToEndWorkflowEditorState.js +23 -0
- package/lib/stores/editor/editor-state/end-to-end-workflow-state/EndToEndWorkflowEditorState.js.map +1 -0
- package/lib/stores/editor/editor-state/end-to-end-workflow-state/QueryConnectionEndToEndWorkflowEditorState.d.ts +111 -0
- package/lib/stores/editor/editor-state/end-to-end-workflow-state/QueryConnectionEndToEndWorkflowEditorState.d.ts.map +1 -0
- package/lib/stores/editor/editor-state/end-to-end-workflow-state/QueryConnectionEndToEndWorkflowEditorState.js +453 -0
- package/lib/stores/editor/editor-state/end-to-end-workflow-state/QueryConnectionEndToEndWorkflowEditorState.js.map +1 -0
- package/lib/stores/editor/sidebar-state/end-to-end-workflow/GlobalEndToEndFlowState.d.ts +24 -0
- package/lib/stores/editor/sidebar-state/end-to-end-workflow/GlobalEndToEndFlowState.d.ts.map +1 -0
- package/lib/stores/editor/sidebar-state/end-to-end-workflow/GlobalEndToEndFlowState.js +37 -0
- package/lib/stores/editor/sidebar-state/end-to-end-workflow/GlobalEndToEndFlowState.js.map +1 -0
- package/lib/stores/showcase/ShowcaseViewerStore.d.ts.map +1 -1
- package/lib/stores/showcase/ShowcaseViewerStore.js +5 -1
- package/lib/stores/showcase/ShowcaseViewerStore.js.map +1 -1
- package/package.json +5 -5
- package/src/__lib__/LegendStudioCommand.ts +5 -0
- package/src/components/ShowcaseManager.tsx +18 -0
- package/src/components/editor/ActivityBar.tsx +56 -15
- package/src/components/editor/editor-group/EditorGroup.tsx +21 -1
- package/src/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.tsx +136 -103
- package/src/components/editor/editor-group/connection-editor/DatabaseModelBuilder.tsx +97 -53
- package/src/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.tsx +4 -3
- package/src/components/editor/editor-group/end-to-end-flow-editor/ConnectionToQueryWorkflowEditor.tsx +518 -0
- package/src/components/editor/editor-group/service-editor/ServiceExecutionQueryEditor.tsx +1 -1
- package/src/components/editor/side-bar/Explorer.tsx +7 -6
- package/src/components/editor/side-bar/SideBar.tsx +13 -1
- package/src/components/editor/side-bar/end-to-end-workflow/EndToEndWorkflows.tsx +102 -0
- package/src/stores/ShowcaseManagerState.ts +19 -1
- package/src/stores/editor/EditorConfig.ts +3 -0
- package/src/stores/editor/EditorStore.ts +21 -0
- package/src/stores/editor/ExplorerTreeState.ts +1 -0
- package/src/stores/editor/GraphEditGrammarModeState.ts +3 -3
- package/src/stores/editor/NewElementState.ts +1 -1
- package/src/stores/editor/editor-state/element-editor-state/ElementEditorState.ts +2 -1
- package/src/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.ts +77 -49
- package/src/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.ts +1 -2
- package/src/stores/editor/editor-state/element-editor-state/connection/DatabaseModelBuilderState.ts +12 -8
- package/src/stores/editor/editor-state/end-to-end-workflow-state/EndToEndWorkflowEditorState.ts +23 -0
- package/src/stores/editor/editor-state/end-to-end-workflow-state/QueryConnectionEndToEndWorkflowEditorState.ts +775 -0
- package/src/stores/editor/sidebar-state/end-to-end-workflow/GlobalEndToEndFlowState.ts +43 -0
- package/src/stores/showcase/ShowcaseViewerStore.ts +4 -0
- package/tsconfig.json +5 -0
package/src/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.tsx
CHANGED
@@ -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.
|
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 =
|
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.
|
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.
|
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 {
|
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 ||
|
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.
|
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 {
|
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
|
}
|