@finos/legend-application-studio 28.19.65 → 28.19.67
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/application/LegendStudioApplicationConfig.d.ts +6 -0
- package/lib/application/LegendStudioApplicationConfig.d.ts.map +1 -1
- package/lib/application/LegendStudioApplicationConfig.js +10 -0
- package/lib/application/LegendStudioApplicationConfig.js.map +1 -1
- package/lib/application/LegendStudioPluginManager.d.ts +5 -1
- package/lib/application/LegendStudioPluginManager.d.ts.map +1 -1
- package/lib/application/LegendStudioPluginManager.js +7 -0
- package/lib/application/LegendStudioPluginManager.js.map +1 -1
- package/lib/components/editor/ActivityBar.d.ts.map +1 -1
- package/lib/components/editor/ActivityBar.js +7 -1
- package/lib/components/editor/ActivityBar.js.map +1 -1
- package/lib/components/editor/editor-group/dataProduct/DataProductEditor.d.ts.map +1 -1
- package/lib/components/editor/editor-group/dataProduct/DataProductEditor.js +20 -5
- package/lib/components/editor/editor-group/dataProduct/DataProductEditor.js.map +1 -1
- package/lib/components/editor/side-bar/DevMetadataPanel.d.ts +19 -0
- package/lib/components/editor/side-bar/DevMetadataPanel.d.ts.map +1 -0
- package/lib/components/editor/side-bar/DevMetadataPanel.js +58 -0
- package/lib/components/editor/side-bar/DevMetadataPanel.js.map +1 -0
- package/lib/components/editor/side-bar/SideBar.d.ts.map +1 -1
- package/lib/components/editor/side-bar/SideBar.js +3 -0
- package/lib/components/editor/side-bar/SideBar.js.map +1 -1
- package/lib/index.css +1 -1
- package/lib/package.json +1 -1
- package/lib/stores/editor/EditorConfig.d.ts +1 -0
- package/lib/stores/editor/EditorConfig.d.ts.map +1 -1
- package/lib/stores/editor/EditorConfig.js +1 -0
- package/lib/stores/editor/EditorConfig.js.map +1 -1
- package/lib/stores/editor/EditorStore.d.ts +2 -0
- package/lib/stores/editor/EditorStore.d.ts.map +1 -1
- package/lib/stores/editor/EditorStore.js +3 -0
- package/lib/stores/editor/EditorStore.js.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/dataProduct/DataProductEditorState.d.ts.map +1 -1
- package/lib/stores/editor/editor-state/element-editor-state/dataProduct/DataProductEditorState.js +5 -2
- package/lib/stores/editor/editor-state/element-editor-state/dataProduct/DataProductEditorState.js.map +1 -1
- package/lib/stores/editor/sidebar-state/dev-metadata/DevMetadataState.d.ts +29 -0
- package/lib/stores/editor/sidebar-state/dev-metadata/DevMetadataState.d.ts.map +1 -0
- package/lib/stores/editor/sidebar-state/dev-metadata/DevMetadataState.js +77 -0
- package/lib/stores/editor/sidebar-state/dev-metadata/DevMetadataState.js.map +1 -0
- package/lib/stores/graph-modifier/DSL_DataProduct_GraphModifierHelper.d.ts +2 -2
- package/lib/stores/graph-modifier/DSL_DataProduct_GraphModifierHelper.d.ts.map +1 -1
- package/lib/stores/graph-modifier/DSL_DataProduct_GraphModifierHelper.js +7 -7
- package/lib/stores/graph-modifier/DSL_DataProduct_GraphModifierHelper.js.map +1 -1
- package/package.json +15 -15
- package/src/application/LegendStudioApplicationConfig.ts +17 -0
- package/src/application/LegendStudioPluginManager.ts +13 -1
- package/src/components/editor/ActivityBar.tsx +12 -0
- package/src/components/editor/editor-group/dataProduct/DataProductEditor.tsx +89 -60
- package/src/components/editor/side-bar/DevMetadataPanel.tsx +168 -0
- package/src/components/editor/side-bar/SideBar.tsx +3 -0
- package/src/stores/editor/EditorConfig.ts +1 -0
- package/src/stores/editor/EditorStore.ts +3 -0
- package/src/stores/editor/editor-state/element-editor-state/dataProduct/DataProductEditorState.ts +6 -2
- package/src/stores/editor/sidebar-state/dev-metadata/DevMetadataState.ts +111 -0
- package/src/stores/graph-modifier/DSL_DataProduct_GraphModifierHelper.ts +9 -9
- package/tsconfig.json +2 -0
|
@@ -88,7 +88,11 @@ import {
|
|
|
88
88
|
useRef,
|
|
89
89
|
useState,
|
|
90
90
|
} from 'react';
|
|
91
|
-
import {
|
|
91
|
+
import {
|
|
92
|
+
filterByType,
|
|
93
|
+
guaranteeType,
|
|
94
|
+
UserSearchService,
|
|
95
|
+
} from '@finos/legend-shared';
|
|
92
96
|
import { InlineLambdaEditor, LineageViewer } from '@finos/legend-query-builder';
|
|
93
97
|
import { action, autorun, flowResult } from 'mobx';
|
|
94
98
|
import { useAuth } from 'react-oidc-context';
|
|
@@ -142,7 +146,7 @@ import {
|
|
|
142
146
|
expertise_setDescription,
|
|
143
147
|
expertise_addId,
|
|
144
148
|
expertise_deleteId,
|
|
145
|
-
|
|
149
|
+
supportInfo_deleteExpertise,
|
|
146
150
|
externalType_setLinkURL,
|
|
147
151
|
externalType_setLinkLabel,
|
|
148
152
|
accessPointGroup_setTitle,
|
|
@@ -2488,7 +2492,9 @@ const ExpertiseEditor = observer(
|
|
|
2488
2492
|
};
|
|
2489
2493
|
|
|
2490
2494
|
const handleRemoveExpertise = (expertise: Expertise) => {
|
|
2491
|
-
|
|
2495
|
+
if (product.supportInfo) {
|
|
2496
|
+
supportInfo_deleteExpertise(product.supportInfo, expertise);
|
|
2497
|
+
}
|
|
2492
2498
|
};
|
|
2493
2499
|
|
|
2494
2500
|
return (
|
|
@@ -2507,66 +2513,68 @@ const ExpertiseEditor = observer(
|
|
|
2507
2513
|
</PanelHeaderActionItem>
|
|
2508
2514
|
</PanelHeaderActions>
|
|
2509
2515
|
</PanelHeader>
|
|
2510
|
-
{dataProductEditorState.product.expertise?.map(
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
<div className="
|
|
2514
|
-
<div className="
|
|
2515
|
-
|
|
2516
|
-
|
|
2517
|
-
|
|
2518
|
-
|
|
2519
|
-
|
|
2520
|
-
|
|
2521
|
-
|
|
2522
|
-
|
|
2523
|
-
|
|
2524
|
-
|
|
2525
|
-
|
|
2526
|
-
|
|
2527
|
-
|
|
2528
|
-
|
|
2529
|
-
|
|
2530
|
-
<div className="panel__content__form__section">
|
|
2531
|
-
<div className="panel__content__form__section__header__prompt">
|
|
2532
|
-
User IDs
|
|
2516
|
+
{dataProductEditorState.product.supportInfo?.expertise?.map(
|
|
2517
|
+
(expertise) => (
|
|
2518
|
+
<>
|
|
2519
|
+
<div className="data-product-editor__expertise">
|
|
2520
|
+
<div className="panel__content__form__section">
|
|
2521
|
+
<div className="panel__content__form__section__header__prompt">
|
|
2522
|
+
Description
|
|
2523
|
+
</div>
|
|
2524
|
+
<textarea
|
|
2525
|
+
className="panel__content__form__section__textarea"
|
|
2526
|
+
spellCheck={false}
|
|
2527
|
+
disabled={dataProductEditorState.isReadOnly}
|
|
2528
|
+
value={expertise.description ?? ''}
|
|
2529
|
+
onChange={(event) =>
|
|
2530
|
+
updateExpertiseDescription(expertise, event.target.value)
|
|
2531
|
+
}
|
|
2532
|
+
style={{
|
|
2533
|
+
height: '100%',
|
|
2534
|
+
}}
|
|
2535
|
+
/>
|
|
2533
2536
|
</div>
|
|
2534
|
-
<div className="
|
|
2535
|
-
|
|
2536
|
-
|
|
2537
|
-
|
|
2538
|
-
|
|
2539
|
-
|
|
2540
|
-
|
|
2541
|
-
|
|
2542
|
-
|
|
2543
|
-
className="panel__content__form__section__list__item__remove-btn"
|
|
2544
|
-
disabled={dataProductEditorState.isReadOnly}
|
|
2545
|
-
onClick={() => handleRemoveId(expertise, id)}
|
|
2546
|
-
tabIndex={-1}
|
|
2537
|
+
<div className="panel__content__form__section">
|
|
2538
|
+
<div className="panel__content__form__section__header__prompt">
|
|
2539
|
+
User IDs
|
|
2540
|
+
</div>
|
|
2541
|
+
<div className="panel__content__form__section__list__id-list">
|
|
2542
|
+
{expertise.expertIds?.map((id) => (
|
|
2543
|
+
<div
|
|
2544
|
+
className="panel__content__form__section__list__item"
|
|
2545
|
+
key={id}
|
|
2547
2546
|
>
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
|
|
2551
|
-
|
|
2547
|
+
{id}
|
|
2548
|
+
|
|
2549
|
+
<button
|
|
2550
|
+
className="panel__content__form__section__list__item__remove-btn"
|
|
2551
|
+
disabled={dataProductEditorState.isReadOnly}
|
|
2552
|
+
onClick={() => handleRemoveId(expertise, id)}
|
|
2553
|
+
tabIndex={-1}
|
|
2554
|
+
>
|
|
2555
|
+
<TimesIcon />
|
|
2556
|
+
</button>
|
|
2557
|
+
</div>
|
|
2558
|
+
))}
|
|
2559
|
+
</div>
|
|
2560
|
+
<NewExpertIdComponent expertise={expertise} />
|
|
2561
|
+
</div>
|
|
2562
|
+
<div className="data-product-editor__expertise__actions">
|
|
2563
|
+
<button
|
|
2564
|
+
className="access-point-editor__generic-entry__remove-btn--group"
|
|
2565
|
+
onClick={() => {
|
|
2566
|
+
handleRemoveExpertise(expertise);
|
|
2567
|
+
}}
|
|
2568
|
+
tabIndex={-1}
|
|
2569
|
+
title="Remove Expertise"
|
|
2570
|
+
>
|
|
2571
|
+
<TimesIcon />
|
|
2572
|
+
</button>
|
|
2552
2573
|
</div>
|
|
2553
|
-
<NewExpertIdComponent expertise={expertise} />
|
|
2554
|
-
</div>
|
|
2555
|
-
<div className="data-product-editor__expertise__actions">
|
|
2556
|
-
<button
|
|
2557
|
-
className="access-point-editor__generic-entry__remove-btn--group"
|
|
2558
|
-
onClick={() => {
|
|
2559
|
-
handleRemoveExpertise(expertise);
|
|
2560
|
-
}}
|
|
2561
|
-
tabIndex={-1}
|
|
2562
|
-
title="Remove Expertise"
|
|
2563
|
-
>
|
|
2564
|
-
<TimesIcon />
|
|
2565
|
-
</button>
|
|
2566
2574
|
</div>
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
)
|
|
2575
|
+
</>
|
|
2576
|
+
),
|
|
2577
|
+
)}
|
|
2570
2578
|
</>
|
|
2571
2579
|
);
|
|
2572
2580
|
},
|
|
@@ -2852,6 +2860,27 @@ const getDataProductViewerState = (
|
|
|
2852
2860
|
V1_DataProduct,
|
|
2853
2861
|
);
|
|
2854
2862
|
const remoteEngine = guaranteeType(graphManager.engine, V1_RemoteEngine);
|
|
2863
|
+
let userSearchService: UserSearchService | undefined = undefined;
|
|
2864
|
+
if (applicationStore.pluginManager.getUserPlugins().length > 0) {
|
|
2865
|
+
applicationStore.pluginManager
|
|
2866
|
+
.getUserPlugins()
|
|
2867
|
+
.forEach((plugin) =>
|
|
2868
|
+
plugin.setup(
|
|
2869
|
+
applicationStore.config.options.userSearchConfig
|
|
2870
|
+
?.applicationDirectoryUrl,
|
|
2871
|
+
),
|
|
2872
|
+
);
|
|
2873
|
+
userSearchService = new UserSearchService({
|
|
2874
|
+
userProfileImageUrl:
|
|
2875
|
+
applicationStore.config.options.userSearchConfig?.userProfileImageUrl,
|
|
2876
|
+
applicationDirectoryUrl:
|
|
2877
|
+
applicationStore.config.options.userSearchConfig
|
|
2878
|
+
?.applicationDirectoryUrl,
|
|
2879
|
+
});
|
|
2880
|
+
userSearchService.registerPlugins(
|
|
2881
|
+
applicationStore.pluginManager.getUserPlugins(),
|
|
2882
|
+
);
|
|
2883
|
+
}
|
|
2855
2884
|
const dataProductViewerState = new DataProductViewerState(
|
|
2856
2885
|
v1_dataProduct,
|
|
2857
2886
|
applicationStore,
|
|
@@ -2859,7 +2888,7 @@ const getDataProductViewerState = (
|
|
|
2859
2888
|
depotServerClient,
|
|
2860
2889
|
graphManagerState,
|
|
2861
2890
|
applicationStore.config.options.dataProductConfig,
|
|
2862
|
-
|
|
2891
|
+
userSearchService,
|
|
2863
2892
|
undefined,
|
|
2864
2893
|
{},
|
|
2865
2894
|
);
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2020-present, Goldman Sachs
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { observer } from 'mobx-react-lite';
|
|
18
|
+
import { useEditorStore } from '../EditorStoreProvider.js';
|
|
19
|
+
import { useEffect } from 'react';
|
|
20
|
+
import {
|
|
21
|
+
PanelFormSection,
|
|
22
|
+
PanelFormValidatedTextField,
|
|
23
|
+
PanelHeader,
|
|
24
|
+
PanelContent,
|
|
25
|
+
Panel,
|
|
26
|
+
clsx,
|
|
27
|
+
Dialog,
|
|
28
|
+
CheckCircleIcon,
|
|
29
|
+
ModalBody,
|
|
30
|
+
ModalFooterButton,
|
|
31
|
+
ModalFooter,
|
|
32
|
+
ModalHeader,
|
|
33
|
+
Modal,
|
|
34
|
+
ModalTitle,
|
|
35
|
+
} from '@finos/legend-art';
|
|
36
|
+
import { CODE_EDITOR_LANGUAGE } from '@finos/legend-code-editor';
|
|
37
|
+
import { CodeEditor } from '@finos/legend-lego/code-editor';
|
|
38
|
+
import { DevMetadataResult } from '@finos/legend-graph';
|
|
39
|
+
|
|
40
|
+
const DevMetadataResultModal = observer(
|
|
41
|
+
(props: {
|
|
42
|
+
closeModal: () => void;
|
|
43
|
+
deploymentResponse: DevMetadataResult;
|
|
44
|
+
}) => {
|
|
45
|
+
const { closeModal, deploymentResponse } = props;
|
|
46
|
+
return (
|
|
47
|
+
<Dialog
|
|
48
|
+
open={true}
|
|
49
|
+
classes={{
|
|
50
|
+
root: 'ingestion-modal__root-container',
|
|
51
|
+
container: 'ingestion-modal__container',
|
|
52
|
+
paper: 'ingestion-modal__content',
|
|
53
|
+
}}
|
|
54
|
+
>
|
|
55
|
+
<Modal darkMode={true} className="ingestion-modal">
|
|
56
|
+
<ModalHeader>
|
|
57
|
+
<ModalTitle
|
|
58
|
+
icon={<CheckCircleIcon className="ingestion-modal--success" />}
|
|
59
|
+
title="Push Response"
|
|
60
|
+
></ModalTitle>
|
|
61
|
+
</ModalHeader>
|
|
62
|
+
<ModalBody>
|
|
63
|
+
<div className="ingestion-modal__write">
|
|
64
|
+
<div className="ingestion-modal__write--value">
|
|
65
|
+
<CodeEditor
|
|
66
|
+
inputValue={JSON.stringify(
|
|
67
|
+
DevMetadataResult.serialization.toJson(deploymentResponse),
|
|
68
|
+
null,
|
|
69
|
+
2,
|
|
70
|
+
)}
|
|
71
|
+
isReadOnly={true}
|
|
72
|
+
language={CODE_EDITOR_LANGUAGE.JSON}
|
|
73
|
+
extraEditorOptions={{
|
|
74
|
+
wordWrap: 'on',
|
|
75
|
+
}}
|
|
76
|
+
hideActionBar={true}
|
|
77
|
+
/>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
</ModalBody>
|
|
81
|
+
<ModalFooter>
|
|
82
|
+
<ModalFooterButton
|
|
83
|
+
onClick={closeModal}
|
|
84
|
+
text="Close"
|
|
85
|
+
type="secondary"
|
|
86
|
+
/>
|
|
87
|
+
</ModalFooter>
|
|
88
|
+
</Modal>
|
|
89
|
+
</Dialog>
|
|
90
|
+
);
|
|
91
|
+
},
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
export const DevMetadataPanel = observer(() => {
|
|
95
|
+
const editorStore = useEditorStore();
|
|
96
|
+
const devMetadataState = editorStore.devMetadataState;
|
|
97
|
+
|
|
98
|
+
useEffect(() => {
|
|
99
|
+
devMetadataState.init();
|
|
100
|
+
}, [devMetadataState]);
|
|
101
|
+
|
|
102
|
+
const handlePush = (): void => {
|
|
103
|
+
devMetadataState.push();
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const handleDidChange = (value: string | undefined): void => {
|
|
107
|
+
devMetadataState.setDid(value ?? '');
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const isPushDisabled = !devMetadataState.did.trim();
|
|
111
|
+
|
|
112
|
+
return (
|
|
113
|
+
<Panel>
|
|
114
|
+
<PanelHeader className="side-bar__header">
|
|
115
|
+
<div className="panel__header__title">
|
|
116
|
+
<div className="panel__header__title__label side-bar__header__title__content">
|
|
117
|
+
Push to Dev
|
|
118
|
+
</div>
|
|
119
|
+
</div>
|
|
120
|
+
</PanelHeader>
|
|
121
|
+
<PanelContent>
|
|
122
|
+
<form
|
|
123
|
+
onSubmit={(event) => {
|
|
124
|
+
event.preventDefault();
|
|
125
|
+
if (!isPushDisabled) {
|
|
126
|
+
handlePush();
|
|
127
|
+
}
|
|
128
|
+
}}
|
|
129
|
+
>
|
|
130
|
+
<PanelFormSection>
|
|
131
|
+
<div className="panel__content__form__section__header__label">
|
|
132
|
+
DID
|
|
133
|
+
</div>
|
|
134
|
+
<PanelFormValidatedTextField
|
|
135
|
+
value={devMetadataState.did}
|
|
136
|
+
update={handleDidChange}
|
|
137
|
+
placeholder="Enter DID..."
|
|
138
|
+
/>
|
|
139
|
+
</PanelFormSection>
|
|
140
|
+
<PanelFormSection>
|
|
141
|
+
<button
|
|
142
|
+
type="submit"
|
|
143
|
+
className={clsx('btn btn--primary register-service__push-btn', {
|
|
144
|
+
'btn--disabled': isPushDisabled,
|
|
145
|
+
})}
|
|
146
|
+
disabled={isPushDisabled}
|
|
147
|
+
title={
|
|
148
|
+
isPushDisabled
|
|
149
|
+
? 'Please fill in both DID and Project Name'
|
|
150
|
+
: 'Push to Dev'
|
|
151
|
+
}
|
|
152
|
+
>
|
|
153
|
+
<div className="btn__content">
|
|
154
|
+
<div className="btn__content__label">Push</div>
|
|
155
|
+
</div>
|
|
156
|
+
</button>
|
|
157
|
+
</PanelFormSection>
|
|
158
|
+
</form>
|
|
159
|
+
</PanelContent>
|
|
160
|
+
{devMetadataState.result && (
|
|
161
|
+
<DevMetadataResultModal
|
|
162
|
+
closeModal={() => (devMetadataState.result = undefined)}
|
|
163
|
+
deploymentResponse={devMetadataState.result}
|
|
164
|
+
/>
|
|
165
|
+
)}
|
|
166
|
+
</Panel>
|
|
167
|
+
);
|
|
168
|
+
});
|
|
@@ -30,6 +30,7 @@ import { useEditorStore } from '../EditorStoreProvider.js';
|
|
|
30
30
|
import { GlobalTestRunner } from './testable/GlobalTestRunner.js';
|
|
31
31
|
import { RegisterService } from './RegisterService.js';
|
|
32
32
|
import { EndToEndWorkflow } from './end-to-end-workflow/EndToEndWorkflows.js';
|
|
33
|
+
import { DevMetadataPanel } from './DevMetadataPanel.js';
|
|
33
34
|
|
|
34
35
|
/**
|
|
35
36
|
* Wrapper component around different implementations of sidebar, such as to view domain, to manage SDLC, etc.
|
|
@@ -63,6 +64,8 @@ export const SideBar = observer(() => {
|
|
|
63
64
|
globalTestRunnerState={editorStore.globalTestRunnerState}
|
|
64
65
|
/>
|
|
65
66
|
);
|
|
67
|
+
case ACTIVITY_MODE.DEV_MODE:
|
|
68
|
+
return <DevMetadataPanel />;
|
|
66
69
|
case ACTIVITY_MODE.REGISTER_SERVICES:
|
|
67
70
|
return (
|
|
68
71
|
<RegisterService
|
|
@@ -123,6 +123,7 @@ import {
|
|
|
123
123
|
import type { QueryBuilderDataCubeViewerState } from '@finos/legend-query-builder';
|
|
124
124
|
import { EditorInitialConfiguration } from './editor-state/element-editor-state/ElementEditorInitialConfiguration.js';
|
|
125
125
|
import { LakehouseIngestionManager } from '@finos/legend-server-lakehouse';
|
|
126
|
+
import { DevMetadataState } from './sidebar-state/dev-metadata/DevMetadataState.js';
|
|
126
127
|
|
|
127
128
|
export abstract class EditorExtensionState {
|
|
128
129
|
/**
|
|
@@ -181,6 +182,7 @@ export class EditorStore implements CommandRegistrar {
|
|
|
181
182
|
globalBulkServiceRegistrationState: GlobalBulkServiceRegistrationState;
|
|
182
183
|
globalEndToEndWorkflowState: GlobalEndToEndWorkflowState;
|
|
183
184
|
devToolState: DevToolPanelState;
|
|
185
|
+
devMetadataState: DevMetadataState;
|
|
184
186
|
sqlPlaygroundState: SQLPlaygroundPanelState;
|
|
185
187
|
|
|
186
188
|
modelImporterState: ModelImporterState;
|
|
@@ -277,6 +279,7 @@ export class EditorStore implements CommandRegistrar {
|
|
|
277
279
|
this.graphEditorMode = new GraphEditFormModeState(this);
|
|
278
280
|
this.changeDetectionState = new ChangeDetectionState(this, this.graphState);
|
|
279
281
|
this.devToolState = new DevToolPanelState(this);
|
|
282
|
+
this.devMetadataState = new DevMetadataState(this);
|
|
280
283
|
this.sqlPlaygroundState = new SQLPlaygroundPanelState(this);
|
|
281
284
|
this.embeddedQueryBuilderState = new EmbeddedQueryBuilderState(this);
|
|
282
285
|
// side bar panels
|
package/src/stores/editor/editor-state/element-editor-state/dataProduct/DataProductEditorState.ts
CHANGED
|
@@ -97,7 +97,7 @@ import {
|
|
|
97
97
|
accessPointGroup_swapAccessPoints,
|
|
98
98
|
dataProduct_addAccessPoint,
|
|
99
99
|
dataProduct_addAccessPointGroup,
|
|
100
|
-
|
|
100
|
+
supportInfo_addExpertise,
|
|
101
101
|
dataProduct_deleteAccessPoint,
|
|
102
102
|
dataProduct_deleteAccessPointGroup,
|
|
103
103
|
dataProduct_swapAccessPointGroups,
|
|
@@ -108,6 +108,7 @@ import {
|
|
|
108
108
|
modelAccessPointGroup_setDefaultRuntime,
|
|
109
109
|
modelAccessPointGroup_setElementExclude,
|
|
110
110
|
modelAccessPointGroup_setMapping,
|
|
111
|
+
dataProduct_setSupportInfoIfAbsent,
|
|
111
112
|
} from '../../../../graph-modifier/DSL_DataProduct_GraphModifierHelper.js';
|
|
112
113
|
import { LambdaEditorState, LineageState } from '@finos/legend-query-builder';
|
|
113
114
|
import {
|
|
@@ -1093,8 +1094,11 @@ export class DataProductEditorState extends ElementEditorState {
|
|
|
1093
1094
|
}
|
|
1094
1095
|
|
|
1095
1096
|
createExpertise() {
|
|
1097
|
+
dataProduct_setSupportInfoIfAbsent(this.product);
|
|
1096
1098
|
const newExpertise = new Expertise();
|
|
1097
|
-
|
|
1099
|
+
if (this.product.supportInfo) {
|
|
1100
|
+
supportInfo_addExpertise(this.product.supportInfo, newExpertise);
|
|
1101
|
+
}
|
|
1098
1102
|
}
|
|
1099
1103
|
|
|
1100
1104
|
*deploy(token: string | undefined): GeneratorFn<void> {
|
|
@@ -0,0 +1,111 @@
|
|
|
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
|
+
ActionState,
|
|
19
|
+
assertErrorThrown,
|
|
20
|
+
assertNonEmptyString,
|
|
21
|
+
assertNonNullable,
|
|
22
|
+
assertTrue,
|
|
23
|
+
filterByType,
|
|
24
|
+
type GeneratorFn,
|
|
25
|
+
} from '@finos/legend-shared';
|
|
26
|
+
import type { EditorStore } from '../../EditorStore.js';
|
|
27
|
+
import { action, flow, makeObservable, observable } from 'mobx';
|
|
28
|
+
import { type DevMetadataResult, IngestDefinition } from '@finos/legend-graph';
|
|
29
|
+
import { generateGAVCoordinates } from '@finos/legend-storage';
|
|
30
|
+
|
|
31
|
+
export class DevMetadataState {
|
|
32
|
+
readonly editorStore: EditorStore;
|
|
33
|
+
result: DevMetadataResult | undefined;
|
|
34
|
+
pushState = ActionState.create();
|
|
35
|
+
did = '';
|
|
36
|
+
|
|
37
|
+
constructor(editorStore: EditorStore) {
|
|
38
|
+
this.editorStore = editorStore;
|
|
39
|
+
|
|
40
|
+
makeObservable(this, {
|
|
41
|
+
pushState: observable,
|
|
42
|
+
did: observable,
|
|
43
|
+
setDid: action,
|
|
44
|
+
push: flow,
|
|
45
|
+
init: action,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
setDid(did: string): void {
|
|
50
|
+
this.did = did;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
init(): void {
|
|
54
|
+
if (!this.did) {
|
|
55
|
+
const ingestDID = this.editorStore.graphManagerState.graph.allElements
|
|
56
|
+
.filter(filterByType(IngestDefinition))[0]
|
|
57
|
+
?.appDirDeployment?.appDirId?.toString();
|
|
58
|
+
if (ingestDID) {
|
|
59
|
+
this.setDid(ingestDID);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
*push(): GeneratorFn<void> {
|
|
65
|
+
try {
|
|
66
|
+
this.result = undefined;
|
|
67
|
+
const dependenciesSize =
|
|
68
|
+
this.editorStore.graphManagerState.graph.dependencyManager
|
|
69
|
+
.projectDependencyModelsIndex.size;
|
|
70
|
+
assertTrue(
|
|
71
|
+
dependenciesSize === 0,
|
|
72
|
+
'Dependencies not supported in dev mode',
|
|
73
|
+
);
|
|
74
|
+
const currentProjectConfiguration =
|
|
75
|
+
this.editorStore.projectConfigurationEditorState
|
|
76
|
+
.currentProjectConfiguration;
|
|
77
|
+
assertNonNullable(
|
|
78
|
+
currentProjectConfiguration,
|
|
79
|
+
'Project Name required to push to dev mode',
|
|
80
|
+
);
|
|
81
|
+
const projectId = generateGAVCoordinates(
|
|
82
|
+
currentProjectConfiguration.groupId,
|
|
83
|
+
currentProjectConfiguration.artifactId,
|
|
84
|
+
undefined,
|
|
85
|
+
);
|
|
86
|
+
assertNonEmptyString(this.did, 'DID required to push to dev mode');
|
|
87
|
+
this.pushState.inProgress();
|
|
88
|
+
this.editorStore.applicationStore.alertService.setBlockingAlert({
|
|
89
|
+
message: 'Pushing to Dev Mode',
|
|
90
|
+
showLoading: true,
|
|
91
|
+
});
|
|
92
|
+
const result =
|
|
93
|
+
(yield this.editorStore.graphManagerState.graphManager.pushToDevMetadata(
|
|
94
|
+
this.did,
|
|
95
|
+
projectId,
|
|
96
|
+
this.editorStore.graphManagerState.graph,
|
|
97
|
+
)) as DevMetadataResult;
|
|
98
|
+
this.result = result;
|
|
99
|
+
this.editorStore.applicationStore.notificationService.notifySuccess(
|
|
100
|
+
`Pushed to dev mode`,
|
|
101
|
+
);
|
|
102
|
+
} catch (error) {
|
|
103
|
+
assertErrorThrown(error);
|
|
104
|
+
this.pushState.fail();
|
|
105
|
+
} finally {
|
|
106
|
+
this.editorStore.applicationStore.alertService.setBlockingAlert(
|
|
107
|
+
undefined,
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
@@ -201,21 +201,21 @@ export const dataProduct_deleteAccessPointGroup = action(
|
|
|
201
201
|
},
|
|
202
202
|
);
|
|
203
203
|
|
|
204
|
-
export const
|
|
205
|
-
(
|
|
204
|
+
export const supportInfo_addExpertise = action(
|
|
205
|
+
(supportInfo: SupportInfo, expertise: Expertise) => {
|
|
206
206
|
const observedExpertise = observe_Expertise(expertise);
|
|
207
|
-
if (!
|
|
208
|
-
|
|
207
|
+
if (!supportInfo.expertise) {
|
|
208
|
+
supportInfo.expertise = [observedExpertise];
|
|
209
209
|
} else {
|
|
210
|
-
addUniqueEntry(
|
|
210
|
+
addUniqueEntry(supportInfo.expertise, observedExpertise);
|
|
211
211
|
}
|
|
212
212
|
},
|
|
213
213
|
);
|
|
214
214
|
|
|
215
|
-
export const
|
|
216
|
-
(
|
|
217
|
-
if (
|
|
218
|
-
deleteEntry(
|
|
215
|
+
export const supportInfo_deleteExpertise = action(
|
|
216
|
+
(supportInfo: SupportInfo, expertise: Expertise) => {
|
|
217
|
+
if (supportInfo.expertise) {
|
|
218
|
+
deleteEntry(supportInfo.expertise, expertise);
|
|
219
219
|
}
|
|
220
220
|
},
|
|
221
221
|
);
|
package/tsconfig.json
CHANGED
|
@@ -181,6 +181,7 @@
|
|
|
181
181
|
"./src/stores/editor/sidebar-state/WorkspaceSyncState.ts",
|
|
182
182
|
"./src/stores/editor/sidebar-state/WorkspaceUpdateConflictResolutionState.ts",
|
|
183
183
|
"./src/stores/editor/sidebar-state/WorkspaceUpdaterState.ts",
|
|
184
|
+
"./src/stores/editor/sidebar-state/dev-metadata/DevMetadataState.ts",
|
|
184
185
|
"./src/stores/editor/sidebar-state/end-to-end-workflow/GlobalEndToEndFlowState.ts",
|
|
185
186
|
"./src/stores/editor/sidebar-state/testable/GlobalTestRunnerState.ts",
|
|
186
187
|
"./src/stores/editor/utils/DnDUtils.ts",
|
|
@@ -331,6 +332,7 @@
|
|
|
331
332
|
"./src/components/editor/panel-group/ProblemsPanel.tsx",
|
|
332
333
|
"./src/components/editor/panel-group/SQLPlaygroundPanel.tsx",
|
|
333
334
|
"./src/components/editor/side-bar/CreateNewElementModal.tsx",
|
|
335
|
+
"./src/components/editor/side-bar/DevMetadataPanel.tsx",
|
|
334
336
|
"./src/components/editor/side-bar/Explorer.tsx",
|
|
335
337
|
"./src/components/editor/side-bar/LocalChanges.tsx",
|
|
336
338
|
"./src/components/editor/side-bar/ProjectOverview.tsx",
|