Skip to content

Commit 2a98e30

Browse files
committed
second pass
1 parent 958fbee commit 2a98e30

File tree

15 files changed

+80
-174
lines changed

15 files changed

+80
-174
lines changed

packages/model-registry/upstream/frontend/src/odh/components/ModelCatalogDeployButton.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ export const ModelCatalogDeployButton = ({
1212
}) => (
1313
<ModelCatalogDeployModalExtension
1414
model={model}
15-
render={(buttonState, onDeployClick, isModalAvailable) => {
15+
render={(buttonState, onOpenModal, isModalAvailable) => {
1616
const deployButton = (
1717
<Button
1818
id="deploy-button"
1919
aria-label="Deploy model"
2020
variant={ButtonVariant.primary}
21-
onClick={buttonState?.enabled ? onDeployClick : undefined}
21+
onClick={buttonState?.enabled ? onOpenModal : undefined}
2222
isAriaDisabled={!buttonState?.enabled}
2323
data-testid="deploy-button"
2424
>

packages/model-registry/upstream/frontend/src/odh/components/ModelCatalogDeployModalExtension.tsx

Lines changed: 24 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React from 'react';
2-
import { useNavigate, useParams } from 'react-router-dom';
2+
import { useParams } from 'react-router-dom';
33
import { HookNotify, useResolvedExtensions } from '@odh-dashboard/plugin-core';
44
import { isModelCatalogDeployModalExtension } from '~/odh/extension-points';
55
import { CatalogModel, CatalogModelDetailsParams } from '~/app/modelCatalogTypes';
@@ -9,15 +9,10 @@ import {
99
decodeParams,
1010
getModelArtifactUri,
1111
} from '~/app/pages/modelCatalog/utils/modelCatalogUtils';
12-
import {
13-
InitialWizardFormData,
14-
ModelLocationType,
15-
} from '@odh-dashboard/model-serving/types/form-data';
16-
import { extractExternalFormData } from '~/odh/extractExternalFormData';
17-
import {
18-
isExternalFormDataExtension,
19-
isNavigateToWizardExtension,
20-
} from '../extension-points/model-catalog-form-data';
12+
import { InitialWizardFormData } from '@odh-dashboard/model-serving/types/form-data';
13+
import { Deployment } from '@odh-dashboard/model-serving/extension-points';
14+
import { isNavigateToWizardExtension } from '../extension-points/model-catalog-deploy';
15+
import { extractExternalFormData } from '../extractExternalFormData';
2116

2217
type ModelCatalogDeployModalExtensionProps = {
2318
model: CatalogModel;
@@ -35,83 +30,35 @@ const ModelCatalogDeployModalExtension: React.FC<ModelCatalogDeployModalExtensio
3530
const [navigateExtensions, navigateExtensionsLoaded] = useResolvedExtensions(
3631
isNavigateToWizardExtension,
3732
);
38-
const [formDataExtensions, formDataExtensionsLoaded] = useResolvedExtensions(
39-
isExternalFormDataExtension,
40-
);
4133
const [navigateToWizard, setNavigateToWizard] = React.useState<
42-
((initialData?: InitialWizardFormData, projectName?: string) => void) | null
34+
| ((
35+
deployment?: Deployment | null,
36+
initialData?: InitialWizardFormData | null,
37+
returnRouteValue?: string,
38+
) => (projectName?: string) => void)
39+
| null
4340
>(null);
44-
const [platformExtensions, platformExtensionsLoaded] = useResolvedExtensions(
45-
isModelCatalogDeployModalExtension,
46-
);
41+
const [platformExtensions] = useResolvedExtensions(isModelCatalogDeployModalExtension);
4742
const [availablePlatformIds, setAvailablePlatformIds] = React.useState<string[]>([]);
4843
const buttonState = getDeployButtonState(availablePlatformIds, true);
49-
// const isModalAvailable = React.useMemo(
50-
// () => extensionsLoaded && extensions.length > 0 && !!navigateToWizard,
51-
// [extensionsLoaded, extensions.length, navigateToWizard],
52-
// );
53-
const isModalAvailable = React.useMemo(
54-
() =>
55-
navigateExtensionsLoaded &&
56-
navigateExtensions.length > 0 &&
57-
!!navigateToWizard &&
58-
formDataExtensionsLoaded &&
59-
formDataExtensions.length > 0 &&
60-
artifactLoaded &&
61-
!artifactsLoadError,
62-
[
63-
navigateExtensionsLoaded,
64-
navigateExtensions.length,
65-
navigateToWizard,
66-
formDataExtensionsLoaded,
67-
formDataExtensions.length,
68-
],
69-
);
7044

7145
const params = useParams<CatalogModelDetailsParams>();
7246
const decodedParams = decodeParams(params);
73-
const [artifacts, artifactLoaded, artifactsLoadError] = useCatalogModelArtifacts(
47+
const [artifacts] = useCatalogModelArtifacts(
7448
decodedParams.sourceId || '',
7549
encodeURIComponent(`${decodedParams.modelName}`),
7650
);
7751
const uri = artifacts.items.length > 0 ? getModelArtifactUri(artifacts.items) : '';
7852

79-
// Extract form data using extension
80-
const wizardInitialData = React.useMemo((): InitialWizardFormData | undefined => {
81-
if (
82-
!formDataExtensionsLoaded ||
83-
formDataExtensions.length === 0 ||
84-
!uri ||
85-
!artifactLoaded ||
86-
artifactsLoadError
87-
) {
88-
return undefined;
89-
}
90-
91-
try {
92-
const extractFn = formDataExtensions[0].properties.extractFormData;
93-
const formData = extractFn(uri, model.name);
94-
if (!formData) return undefined;
95-
96-
return formData;
97-
} catch (e) {
98-
console.error('Failed to extract form data:', e);
99-
return undefined;
100-
}
101-
}, [
102-
uri,
103-
formDataExtensions,
104-
formDataExtensionsLoaded,
105-
artifactLoaded,
106-
artifactsLoadError,
107-
model.name,
108-
]);
109-
110-
const onDeployClick = React.useCallback(() => {
111-
if (navigateToWizard && wizardInitialData) {
112-
navigateToWizard(wizardInitialData);
53+
const wizardInitialData = React.useMemo(
54+
() => extractExternalFormData(uri, model.name),
55+
[uri, model.name],
56+
);
57+
const onOpenModal = React.useCallback(() => {
58+
if (navigateToWizard) {
59+
navigateToWizard();
11360
}
114-
}, [navigateToWizard, wizardInitialData]);
61+
}, [navigateToWizard]);
11562

11663
return (
11764
<>
@@ -133,15 +80,16 @@ const ModelCatalogDeployModalExtension: React.FC<ModelCatalogDeployModalExtensio
13380
navigateExtensions.map((extension) => (
13481
<HookNotify
13582
key={extension.uid}
136-
useHook={extension.properties.useNavigateToWizard}
83+
useHook={extension.properties.useNavigateToDeploymentWizard}
84+
args={[undefined, wizardInitialData, '/ai-hub/deployments/']}
13785
onNotify={(fn) => {
13886
if (fn && typeof fn === 'function') {
13987
setNavigateToWizard(() => fn);
14088
}
14189
}}
14290
/>
14391
))}
144-
{render(buttonState, onDeployClick, navigateExtensionsLoaded && !!navigateToWizard)}
92+
{render(buttonState, onOpenModal, navigateExtensionsLoaded && !!navigateToWizard)}
14593
</>
14694
);
14795
};

packages/model-registry/upstream/frontend/src/odh/extension-points/model-catalog-deploy.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import type { Extension, CodeRef } from '@openshift/dynamic-plugin-sdk';
2+
import type { InitialWizardFormData } from '@odh-dashboard/model-serving/types/form-data';
3+
import { Deployment } from '@odh-dashboard/model-serving/extension-points';
24
import type { ModelDeployPrefillInfo } from '~/odh/hooks/useRegisteredModelDeployPrefillInfo';
35

46
export type ModelCatalogDeployModalExtension = Extension<
@@ -23,3 +25,17 @@ export const isModelCatalogDeployModalExtension = (
2325
extension: Extension,
2426
): extension is ModelCatalogDeployModalExtension =>
2527
extension.type === 'model-catalog.model-details/deploy-modal';
28+
29+
export type NavigateToWizardExtension = Extension<
30+
'model-serving.deployment/navigate-wizard',
31+
{
32+
useNavigateToDeploymentWizard: CodeRef<
33+
(deployment?: Deployment | null, initialData?: InitialWizardFormData | null, returnRouteValue?: string) => (projectName?: string) => void
34+
>;
35+
}
36+
>;
37+
38+
export const isNavigateToWizardExtension = (
39+
extension: Extension,
40+
): extension is NavigateToWizardExtension =>
41+
extension.type === 'model-serving.deployment/navigate-wizard';

packages/model-registry/upstream/frontend/src/odh/extension-points/model-catalog-form-data.ts

Lines changed: 0 additions & 30 deletions
This file was deleted.

packages/model-registry/upstream/frontend/src/odh/extensions.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@ import type {
44
RouteExtension,
55
AreaExtension,
66
} from '@odh-dashboard/plugin-core/extension-points';
7-
import type { ExternalFormDataExtension } from './extension-points/model-catalog-form-data';
87

98
const reliantAreas = ['model-registry'];
109
const PLUGIN_MODEL_REGISTRY = 'model-registry-plugin';
1110

12-
const extensions: (NavExtension | RouteExtension | AreaExtension | ExternalFormDataExtension)[] = [
11+
const extensions: (NavExtension | RouteExtension | AreaExtension)[] = [
1312
{
1413
type: 'app.area',
1514
properties: {
@@ -104,13 +103,6 @@ const extensions: (NavExtension | RouteExtension | AreaExtension | ExternalFormD
104103
component: () => import('./ModelRegistrySettingsRoutesWrapper'),
105104
},
106105
},
107-
{
108-
type: 'model-serving.external/extract-form-data',
109-
properties: {
110-
extractFormData: () =>
111-
import('./extractExternalFormData').then((m) => m.extractExternalFormData),
112-
},
113-
},
114106
];
115107

116108
export default extensions;

packages/model-registry/upstream/frontend/src/odh/extractExternalFormData.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export const extractExternalFormData = (
99
if (!modelUri) return null;
1010

1111
return {
12+
wizardStartIndex: 2,
1213
modelLocationData: {
1314
type: ModelLocationType.NEW,
1415
fieldValues: {
@@ -24,6 +25,7 @@ export const extractExternalFormData = (
2425
modelTypeField: ServingRuntimeModelType.GENERATIVE,
2526
k8sNameDesc: {
2627
name: modelName,
28+
description: '',
2729
k8sName: {
2830
value: modelName,
2931
state: {
@@ -34,7 +36,6 @@ export const extractExternalFormData = (
3436
touched: false,
3537
},
3638
},
37-
description: '',
3839
},
3940
};
4041
};

packages/model-serving/extension-points/index.ts

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -301,8 +301,12 @@ export const isDeploymentWizardFieldExtension = <D extends Deployment = Deployme
301301
export type ModelServingNavigateToWizardExtension = Extension<
302302
'model-serving.deployment/navigate-wizard',
303303
{
304-
useNavigateToWizard: CodeRef<
305-
() => (initialData?: InitialWizardFormData, projectName?: string) => void
304+
useNavigateToDeploymentWizard: CodeRef<
305+
(
306+
deployment?: Deployment | null,
307+
initialData?: InitialWizardFormData | null,
308+
returnRouteValue?: string,
309+
) => (projectName?: string) => void
306310
>;
307311
}
308312
>;
@@ -311,15 +315,3 @@ export const isModelServingNavigateToWizardExtension = (
311315
extension: Extension,
312316
): extension is ModelServingNavigateToWizardExtension =>
313317
extension.type === 'model-serving.deployment/navigate-wizard';
314-
315-
export type ExternalFormDataExtension = Extension<
316-
'model-serving.external/extract-form-data',
317-
{
318-
extractFormData: CodeRef<(modelUri: string, modelName: string) => InitialWizardFormData | null>;
319-
}
320-
>;
321-
322-
export const isExternalFormDataExtension = (
323-
extension: Extension,
324-
): extension is ExternalFormDataExtension =>
325-
extension.type === 'model-serving.external/extract-form-data';

packages/model-serving/extensions/odh.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,9 @@ const extensions: (
108108
{
109109
type: 'model-serving.deployment/navigate-wizard',
110110
properties: {
111-
useNavigateToWizard: () =>
112-
import('../src/components/deploymentWizard/useNavigateToWizardFromExtension').then(
113-
(m) => m.useNavigateToWizardFromExtension,
111+
useNavigateToDeploymentWizard: () =>
112+
import('../src/components/deploymentWizard/useNavigateToDeploymentWizard').then(
113+
(m) => m.useNavigateToDeploymentWizard,
114114
),
115115
},
116116
flags: {

packages/model-serving/src/__tests__/mockUtils.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ export const mockDeploymentWizardState = (
148148
connectionsLoaded: true,
149149
connectionTypes: [],
150150
connectionTypesLoaded: true,
151+
disableInputFields: false,
151152
},
152153
createConnectionData: {
153154
data: {

packages/model-serving/src/components/deploymentWizard/ModelDeploymentWizard.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ const ModelDeploymentWizard: React.FC<ModelDeploymentWizardProps> = ({
179179
onClose={() => setIsExitModalOpen(true)}
180180
onSave={() => onSave()}
181181
footer={wizardFooter}
182+
startIndex={wizardState.initialData?.wizardStartIndex ?? 1}
182183
>
183184
<WizardStep name="Model details" id="source-model-step">
184185
{wizardState.loaded.modelSourceLoaded ? (

0 commit comments

Comments
 (0)