diff --git a/frontend/src/pages/modelRegistry/screens/components/DeployRegisteredModelModal.tsx b/frontend/src/pages/modelRegistry/screens/components/DeployRegisteredModelModal.tsx index 32fcedc013..7f5e0d4e0b 100644 --- a/frontend/src/pages/modelRegistry/screens/components/DeployRegisteredModelModal.tsx +++ b/frontend/src/pages/modelRegistry/screens/components/DeployRegisteredModelModal.tsx @@ -61,11 +61,35 @@ const DeployRegisteredModelModal: React.FC = ({ [onCancel, onSubmit], ); + const projectSection = ( + + ); + if ( (platform === ServingRuntimePlatform.MULTI && !projectDeployStatusLoaded) || !selectedProject || !platform ) { + const modalForm = ( +
+ {deployInfoError ? ( + + {deployInfoError.message} + + ) : !deployInfoLoaded ? ( + + ) : ( + {projectSection} + )} + + ); + return ( = ({ ]} showClose > -
- {deployInfoError ? ( - - {deployInfoError.message} - - ) : !deployInfoLoaded ? ( - - ) : ( - - - - )} - + {modalForm}
); } @@ -110,20 +116,11 @@ const DeployRegisteredModelModal: React.FC = ({ return ( - } + projectSection={projectSection} /> ); } @@ -131,19 +128,10 @@ const DeployRegisteredModelModal: React.FC = ({ return ( - } + projectSection={projectSection} /> ); }; diff --git a/frontend/src/pages/modelRegistrySettings/CreateModal.tsx b/frontend/src/pages/modelRegistrySettings/CreateModal.tsx index e70042af5b..dc474a8a6e 100644 --- a/frontend/src/pages/modelRegistrySettings/CreateModal.tsx +++ b/frontend/src/pages/modelRegistrySettings/CreateModal.tsx @@ -20,12 +20,11 @@ import FormSection from '~/components/pf-overrides/FormSection'; import { AreaContext } from '~/concepts/areas/AreaContext'; type CreateModalProps = { - isOpen: boolean; onClose: () => void; refresh: () => Promise; }; -const CreateModal: React.FC = ({ isOpen, onClose, refresh }) => { +const CreateModal: React.FC = ({ onClose, refresh }) => { const [isSubmitting, setIsSubmitting] = React.useState(false); const [error, setError] = React.useState(); const [nameDesc, setNameDesc] = React.useState({ @@ -125,7 +124,7 @@ const CreateModal: React.FC = ({ isOpen, onClose, refresh }) = return ( void; refresh: () => Promise; }; const DeleteModelRegistryModal: React.FC = ({ modelRegistry: mr, - isOpen, onClose, refresh, }) => { @@ -49,7 +47,7 @@ const DeleteModelRegistryModal: React.FC = ({ data-testid="delete-mr-modal" titleIconVariant="warning" title="Delete model registry?" - isOpen={isOpen} + isOpen onClose={onClose} variant="medium" footer={ diff --git a/frontend/src/pages/modelRegistrySettings/ModelRegistriesTableRow.tsx b/frontend/src/pages/modelRegistrySettings/ModelRegistriesTableRow.tsx index cd75a344f5..062085ed1b 100644 --- a/frontend/src/pages/modelRegistrySettings/ModelRegistriesTableRow.tsx +++ b/frontend/src/pages/modelRegistrySettings/ModelRegistriesTableRow.tsx @@ -57,17 +57,19 @@ const ModelRegistriesTableRow: React.FC = ({ /> - setIsDatabaseConfigModalOpen(false)} - /> - setIsDeleteModalOpen(false)} - refresh={refresh} - /> + {isDatabaseConfigModalOpen ? ( + setIsDatabaseConfigModalOpen(false)} + /> + ) : null} + {isDeleteModalOpen ? ( + setIsDeleteModalOpen(false)} + refresh={refresh} + /> + ) : null} ); }; diff --git a/frontend/src/pages/modelRegistrySettings/ModelRegistrySettings.tsx b/frontend/src/pages/modelRegistrySettings/ModelRegistrySettings.tsx index 2417210a08..decf51d8ed 100644 --- a/frontend/src/pages/modelRegistrySettings/ModelRegistrySettings.tsx +++ b/frontend/src/pages/modelRegistrySettings/ModelRegistrySettings.tsx @@ -71,11 +71,9 @@ const ModelRegistrySettings: React.FC = () => { }} /> - setCreateModalOpen(false)} - refresh={refreshAll} - /> + {createModalOpen ? ( + setCreateModalOpen(false)} refresh={refreshAll} /> + ) : null} ); }; diff --git a/frontend/src/pages/modelRegistrySettings/ViewDatabaseConfigModal.tsx b/frontend/src/pages/modelRegistrySettings/ViewDatabaseConfigModal.tsx index 955a954fd7..468db815ff 100644 --- a/frontend/src/pages/modelRegistrySettings/ViewDatabaseConfigModal.tsx +++ b/frontend/src/pages/modelRegistrySettings/ViewDatabaseConfigModal.tsx @@ -11,19 +11,17 @@ import { } from '@patternfly/react-core'; import spacing from '@patternfly/react-styles/css/utilities/Spacing/spacing'; import { ModelRegistryKind } from '~/k8sTypes'; -import useFetchState, { NotReadyError } from '~/utilities/useFetchState'; +import useFetchState from '~/utilities/useFetchState'; import { getModelRegistryBackend } from '~/services/modelRegistrySettingsService'; import ModelRegistryDatabasePassword from './ModelRegistryDatabasePassword'; type ViewDatabaseConfigModalProps = { modelRegistry: ModelRegistryKind; - isOpen: boolean; onClose: () => void; }; const ViewDatabaseConfigModal: React.FC = ({ modelRegistry: mr, - isOpen, onClose, }) => { const dbSpec = mr.spec.mysql || mr.spec.postgres; @@ -34,12 +32,9 @@ const ViewDatabaseConfigModal: React.FC = ({ const [password, passwordLoaded, passwordLoadError] = useFetchState( React.useCallback(async () => { - if (!isOpen) { - throw new NotReadyError('Defer load until modal opened'); - } const { databasePassword } = await getModelRegistryBackend(mr.metadata.name); return databasePassword; - }, [mr, isOpen]), + }, [mr]), undefined, ); @@ -47,7 +42,7 @@ const ViewDatabaseConfigModal: React.FC = ({ = ({ }} /> ) : null} - { - fireFormTrackingEvent('Model Updated', { - outcome: edited ? TrackingOutcome.submit : TrackingOutcome.cancel, - type: 'multi', - }); - if (edited) { - refresh?.(); - } - setEditInferenceService(undefined); - }} - /> - sr.metadata.name === editInferenceService.spec.predictor.model?.runtime, - ) - : undefined, - secrets: [], - }, - secrets: filterTokens ? filterTokens(editInferenceService?.metadata.name) : [], - }} - onClose={(edited) => { - if (edited) { - refresh?.(); - } - setEditInferenceService(undefined); - }} - /> + {!!editInferenceService && isModelMesh(editInferenceService) ? ( + { + fireFormTrackingEvent('Model Updated', { + outcome: edited ? TrackingOutcome.submit : TrackingOutcome.cancel, + type: 'multi', + }); + if (edited) { + refresh?.(); + } + setEditInferenceService(undefined); + }} + /> + ) : null} + {!!editInferenceService && !isModelMesh(editInferenceService) ? ( + sr.metadata.name === editInferenceService.spec.predictor.model?.runtime, + ), + secrets: [], + }, + secrets: filterTokens ? filterTokens(editInferenceService.metadata.name) : [], + }} + onClose={(edited) => { + if (edited) { + refresh?.(); + } + setEditInferenceService(undefined); + }} + /> + ) : null} ); }; diff --git a/frontend/src/pages/modelServing/screens/global/ServeModelButton.tsx b/frontend/src/pages/modelServing/screens/global/ServeModelButton.tsx index e9a5029d20..73607f2858 100644 --- a/frontend/src/pages/modelServing/screens/global/ServeModelButton.tsx +++ b/frontend/src/pages/modelServing/screens/global/ServeModelButton.tsx @@ -66,42 +66,42 @@ const ServeModelButton: React.FC = () => { ); + if (!project) { + return ( + + {deployButton} + + ); + } + return ( <> - {!project ? ( - - {deployButton} - - ) : ( - deployButton - )} - {project && ( - <> - { - onSubmit(submit); - }} - /> - - getTemplateEnabledForPlatform(template, ServingRuntimePlatform.SINGLE), - )} - onClose={(submit: boolean) => { - onSubmit(submit); - }} - /> - - )} + {deployButton} + {platformSelected === ServingRuntimePlatform.MULTI ? ( + { + onSubmit(submit); + }} + /> + ) : null} + {platformSelected === ServingRuntimePlatform.SINGLE ? ( + + getTemplateEnabledForPlatform(template, ServingRuntimePlatform.SINGLE), + )} + onClose={(submit: boolean) => { + onSubmit(submit); + }} + /> + ) : null} ); }; diff --git a/frontend/src/pages/modelServing/screens/metrics/bias/BiasConfigurationPage/BiasConfigurationModal/ManageBiasConfigurationModal.tsx b/frontend/src/pages/modelServing/screens/metrics/bias/BiasConfigurationPage/BiasConfigurationModal/ManageBiasConfigurationModal.tsx index d7f19660a5..d349a8bd71 100644 --- a/frontend/src/pages/modelServing/screens/metrics/bias/BiasConfigurationPage/BiasConfigurationModal/ManageBiasConfigurationModal.tsx +++ b/frontend/src/pages/modelServing/screens/metrics/bias/BiasConfigurationPage/BiasConfigurationModal/ManageBiasConfigurationModal.tsx @@ -16,14 +16,12 @@ import MetricTypeField from './MetricTypeField'; type ManageBiasConfigurationModalProps = { existingConfiguration?: BiasMetricConfig; - isOpen: boolean; onClose: (submit: boolean) => void; inferenceService: InferenceServiceKind; }; const ManageBiasConfigurationModal: React.FC = ({ existingConfiguration, - isOpen, onClose, inferenceService, }) => { @@ -67,7 +65,7 @@ const ManageBiasConfigurationModal: React.FC onBeforeClose(false)} footer={ = ({ onConfigure={() => setOpen(true)} /> - { - if (submit) { - refresh(); - } - setOpen(false); - }} - inferenceService={inferenceService} - /> + {isOpen ? ( + { + if (submit) { + refresh(); + } + setOpen(false); + }} + inferenceService={inferenceService} + /> + ) : null} ); }; diff --git a/frontend/src/pages/modelServing/screens/metrics/bias/BiasConfigurationPage/BiasConfigurationTable.tsx b/frontend/src/pages/modelServing/screens/metrics/bias/BiasConfigurationPage/BiasConfigurationTable.tsx index 14bdc7393e..ea9e8f0220 100644 --- a/frontend/src/pages/modelServing/screens/metrics/bias/BiasConfigurationPage/BiasConfigurationTable.tsx +++ b/frontend/src/pages/modelServing/screens/metrics/bias/BiasConfigurationPage/BiasConfigurationTable.tsx @@ -96,17 +96,18 @@ const BiasConfigurationTable: React.FC = ({ } /> - { - if (submit) { - refresh(); - } - setCloneConfiguration(undefined); - }} - inferenceService={inferenceService} - /> + {cloneConfiguration ? ( + { + if (submit) { + refresh(); + } + setCloneConfiguration(undefined); + }} + inferenceService={inferenceService} + /> + ) : null} {deleteConfiguration ? ( { - - getTemplateEnabledForPlatform(template, ServingRuntimePlatform.MULTI), - )} - onClose={(submit: boolean) => { - setOpen(false); - onSubmit(submit); - }} - /> + {open ? ( + + getTemplateEnabledForPlatform(template, ServingRuntimePlatform.MULTI), + )} + onClose={(submit: boolean) => { + setOpen(false); + onSubmit(submit); + }} + /> + ) : null} ); }; diff --git a/frontend/src/pages/modelServing/screens/projects/EmptyNIMModelServingCard.tsx b/frontend/src/pages/modelServing/screens/projects/EmptyNIMModelServingCard.tsx index 467c139ea0..db0d61d520 100644 --- a/frontend/src/pages/modelServing/screens/projects/EmptyNIMModelServingCard.tsx +++ b/frontend/src/pages/modelServing/screens/projects/EmptyNIMModelServingCard.tsx @@ -81,7 +81,6 @@ const EmptyNIMModelServingCard: React.FC = () => { {open && ( { - - getTemplateEnabledForPlatform(template, ServingRuntimePlatform.SINGLE), - )} - onClose={(submit) => { - onSubmit(submit); - setOpen(false); - }} - /> + {open ? ( + + getTemplateEnabledForPlatform(template, ServingRuntimePlatform.SINGLE), + )} + onClose={(submit) => { + onSubmit(submit); + setOpen(false); + }} + /> + ) : null} ); }; diff --git a/frontend/src/pages/modelServing/screens/projects/InferenceServiceModal/ManageInferenceServiceModal.tsx b/frontend/src/pages/modelServing/screens/projects/InferenceServiceModal/ManageInferenceServiceModal.tsx index 76ca7e7eef..6cf00b6aa6 100644 --- a/frontend/src/pages/modelServing/screens/projects/InferenceServiceModal/ManageInferenceServiceModal.tsx +++ b/frontend/src/pages/modelServing/screens/projects/InferenceServiceModal/ManageInferenceServiceModal.tsx @@ -23,7 +23,6 @@ import InferenceServiceServingRuntimeSection from './InferenceServiceServingRunt import InferenceServiceNameSection from './InferenceServiceNameSection'; type ManageInferenceServiceModalProps = { - isOpen: boolean; onClose: (submit: boolean) => void; registeredModelDeployInfo?: RegisteredModelDeployInfo; shouldFormHidden?: boolean; @@ -40,7 +39,6 @@ type ManageInferenceServiceModalProps = { >; const ManageInferenceServiceModal: React.FC = ({ - isOpen, onClose, editInfo, projectContext, @@ -129,7 +127,7 @@ const ManageInferenceServiceModal: React.FC = title={editInfo ? 'Edit model' : 'Deploy model'} description="Configure properties for deploying your model" variant="medium" - isOpen={isOpen} + isOpen onClose={() => onBeforeClose(false)} footer={ { const currentProject = mockProjectK8sResource({}); const wrapper = render( { await act(async () => { wrapper.rerender( { }} /> ) : null} - { - setEditKServeResources(undefined); - if (submit) { - refreshServingRuntime(); - refreshInferenceServices(); - refreshDataConnections(); - refreshServerSecrets(); - } - }} - /> + {editKserveResources ? ( + { + setEditKServeResources(undefined); + if (submit) { + refreshServingRuntime(); + refreshInferenceServices(); + refreshDataConnections(); + refreshServerSecrets(); + } + }} + /> + ) : null} ); }; diff --git a/frontend/src/pages/modelServing/screens/projects/ModelMeshSection/ServingRuntimeTable.tsx b/frontend/src/pages/modelServing/screens/projects/ModelMeshSection/ServingRuntimeTable.tsx index 3e06a42d3f..afe5406ded 100644 --- a/frontend/src/pages/modelServing/screens/projects/ModelMeshSection/ServingRuntimeTable.tsx +++ b/frontend/src/pages/modelServing/screens/projects/ModelMeshSection/ServingRuntimeTable.tsx @@ -74,25 +74,25 @@ const ServingRuntimeTable: React.FC = () => { }} /> ) : null} - { - setEditServingRuntime(undefined); - if (submit) { - refreshServingRuntime(); - refreshInferenceServices(); - setTimeout(refreshTokens, 500); // need a timeout to wait for tokens creation - } - }} - /> + {editServingRuntime ? ( + { + setEditServingRuntime(undefined); + if (submit) { + refreshServingRuntime(); + refreshInferenceServices(); + setTimeout(refreshTokens, 500); // need a timeout to wait for tokens creation + } + }} + /> + ) : null} {deployServingRuntime && ( { setDeployServingRuntime(undefined); if (submit) { diff --git a/frontend/src/pages/modelServing/screens/projects/ModelServingPlatform.tsx b/frontend/src/pages/modelServing/screens/projects/ModelServingPlatform.tsx index 831c9ba6b9..72e43ad35d 100644 --- a/frontend/src/pages/modelServing/screens/projects/ModelServingPlatform.tsx +++ b/frontend/src/pages/modelServing/screens/projects/ModelServingPlatform.tsx @@ -132,6 +132,43 @@ const ModelServingPlatform: React.FC = () => { return ; }; + const renderSelectedPlatformModal = () => { + if (!platformSelected) { + return null; + } + + if (platformSelected === ServingRuntimePlatform.MULTI) { + return ( + + getTemplateEnabledForPlatform(template, ServingRuntimePlatform.MULTI), + )} + onClose={onSubmit} + /> + ); + } + + if (isKServeNIMEnabled) { + return ( + + ); + } + + return ( + + getTemplateEnabledForPlatform(template, ServingRuntimePlatform.SINGLE), + )} + onClose={onSubmit} + /> + ); + }; + return ( <> { )} - - getTemplateEnabledForPlatform(template, ServingRuntimePlatform.MULTI), - )} - onClose={(submit: boolean) => { - onSubmit(submit); - }} - /> - {!isKServeNIMEnabled ? ( - - getTemplateEnabledForPlatform(template, ServingRuntimePlatform.SINGLE), - )} - onClose={(submit: boolean) => { - onSubmit(submit); - }} - /> - ) : ( - { - onSubmit(submit); - }} - /> - )} + {renderSelectedPlatformModal()} ); }; diff --git a/frontend/src/pages/modelServing/screens/projects/NIMServiceModal/DeployNIMServiceModal.tsx b/frontend/src/pages/modelServing/screens/projects/NIMServiceModal/DeployNIMServiceModal.tsx index 14bd9876cc..d182d528df 100644 --- a/frontend/src/pages/modelServing/screens/projects/NIMServiceModal/DeployNIMServiceModal.tsx +++ b/frontend/src/pages/modelServing/screens/projects/NIMServiceModal/DeployNIMServiceModal.tsx @@ -59,7 +59,6 @@ const accessReviewResource: AccessReviewResourceAttributes = { }; type DeployNIMServiceModalProps = { - isOpen: boolean; onClose: (submit: boolean) => void; } & EitherOrNone< { @@ -78,7 +77,6 @@ type DeployNIMServiceModalProps = { >; const DeployNIMServiceModal: React.FC = ({ - isOpen, onClose, projectContext, editInfo, @@ -130,10 +128,10 @@ const DeployNIMServiceModal: React.FC = ({ const [pvcSize, setPvcSize] = React.useState('30Gi'); React.useEffect(() => { - if (currentProjectName && isOpen) { + if (currentProjectName) { setCreateDataInferenceService('project', currentProjectName); } - }, [currentProjectName, setCreateDataInferenceService, isOpen]); + }, [currentProjectName, setCreateDataInferenceService]); // Serving Runtime Validation const isDisabledServingRuntime = @@ -249,7 +247,7 @@ const DeployNIMServiceModal: React.FC = ({ title="Deploy model with NVIDIA NIM" description="Configure properties for deploying your model using an NVIDIA NIM." variant="medium" - isOpen={isOpen} + isOpen onClose={() => onBeforeClose(false)} footer={ void; currentProject: ProjectKind; } & EitherOrNone< @@ -51,7 +50,6 @@ const accessReviewResource: AccessReviewResourceAttributes = { const modelServerAddedName = 'Model Server Added'; const modelServerEditName = 'Model Server Modified'; const ManageServingRuntimeModal: React.FC = ({ - isOpen, onClose, currentProject, servingRuntimeTemplates, @@ -171,7 +169,7 @@ const ManageServingRuntimeModal: React.FC = ({ title={`${editInfo ? 'Edit' : 'Add'} model server`} description="A model server specifies resources available for use by one or more supported models, and includes a serving runtime." variant="medium" - isOpen={isOpen} + isOpen onClose={() => onBeforeClose(false)} showClose footer={ diff --git a/frontend/src/pages/modelServing/screens/projects/kServeModal/ManageKServeModal.tsx b/frontend/src/pages/modelServing/screens/projects/kServeModal/ManageKServeModal.tsx index 5946582e56..4501446fdf 100644 --- a/frontend/src/pages/modelServing/screens/projects/kServeModal/ManageKServeModal.tsx +++ b/frontend/src/pages/modelServing/screens/projects/kServeModal/ManageKServeModal.tsx @@ -64,7 +64,6 @@ const accessReviewResource: AccessReviewResourceAttributes = { }; type ManageKServeModalProps = { - isOpen: boolean; onClose: (submit: boolean) => void; servingRuntimeTemplates?: TemplateKind[]; registeredModelDeployInfo?: RegisteredModelDeployInfo; @@ -87,7 +86,6 @@ type ManageKServeModalProps = { >; const ManageKServeModal: React.FC = ({ - isOpen, onClose, servingRuntimeTemplates, projectContext, @@ -142,10 +140,10 @@ const ManageKServeModal: React.FC = ({ const [alertVisible, setAlertVisible] = React.useState(true); React.useEffect(() => { - if (currentProjectName && isOpen) { + if (currentProjectName) { setCreateDataInferenceService('project', currentProjectName); } - }, [currentProjectName, setCreateDataInferenceService, isOpen]); + }, [currentProjectName, setCreateDataInferenceService]); // Refresh model format selection when changing serving runtime template selection // Don't affect the edit modal @@ -295,7 +293,7 @@ const ManageKServeModal: React.FC = ({ title={editInfo ? 'Edit model' : 'Deploy model'} description="Configure properties for deploying your model" variant="medium" - isOpen={isOpen} + isOpen onClose={() => onBeforeClose(false)} footer={ = ({ selectedPlatform, isNIM /> {modalShown && isProjectModelMesh && !isNIM ? ( getTemplateEnabledForPlatform(template, ServingRuntimePlatform.MULTI), @@ -81,7 +80,6 @@ const AddModelFooter: React.FC = ({ selectedPlatform, isNIM ) : null} {modalShown && !isProjectModelMesh && !isNIM ? ( getTemplateEnabledForPlatform(template, ServingRuntimePlatform.SINGLE), @@ -91,7 +89,6 @@ const AddModelFooter: React.FC = ({ selectedPlatform, isNIM ) : null} {modalShown && isNIM ? (