11import React from 'react' ;
2- import { Spinner , Wizard , WizardStep } from '@patternfly/react-core' ;
2+ import { Spinner , ToggleGroup , ToggleGroupItem , Wizard , WizardStep } from '@patternfly/react-core' ;
33import ApplicationsPage from '@odh-dashboard/internal/pages/ApplicationsPage' ;
44import { getServingRuntimeFromTemplate } from '@odh-dashboard/internal/pages/modelServing/customServingRuntimes/utils' ;
55import { ProjectKind } from '@odh-dashboard/internal/k8sTypes' ;
66import {
77 getGeneratedSecretName ,
88 isGeneratedSecretName ,
99} from '@odh-dashboard/internal/api/k8s/secrets' ;
10+ import { SupportedArea , useIsAreaAvailable } from '@odh-dashboard/internal/concepts/areas' ;
1011import { Deployment } from 'extension-points' ;
1112import { deployModel } from './utils' ;
1213import { ExternalDataLoader , type ExternalDataMap } from './ExternalDataLoader' ;
@@ -22,7 +23,8 @@ import { InitialWizardFormData, WizardStepTitle } from './types';
2223import { ExitDeploymentModal } from './exitModal/ExitDeploymentModal' ;
2324import { useRefreshWizardPage } from './useRefreshWizardPage' ;
2425import { useExitDeploymentWizard } from './exitModal/useExitDeploymentWizard' ;
25- import { DeploymentWizardYAMLView } from './useDeploymentWizardYAMLView' ;
26+ import { DeploymentWizardYAMLView } from './DeploymentWizardYAMLView' ;
27+ import { StepContentToggle } from './ModelDeploymentStepContentToggle' ;
2628import { WizardFooterWithDisablingNext } from '../generic/WizardFooterWithDisablingNext' ;
2729
2830type ModelDeploymentWizardProps = {
@@ -34,9 +36,6 @@ type ModelDeploymentWizardProps = {
3436 existingDeployment ?: Deployment ;
3537 returnRoute ?: string ;
3638 cancelReturnRoute ?: string ;
37- headerAction ?: React . ReactNode ;
38- viewMode ?: 'form' | 'yaml-preview' | 'yaml-edit' ;
39- onModelServerChange ?: ( modelServerName : string | undefined ) => void ;
4039} ;
4140
4241const ModelDeploymentWizard : React . FC < ModelDeploymentWizardProps > = ( {
@@ -48,10 +47,9 @@ const ModelDeploymentWizard: React.FC<ModelDeploymentWizardProps> = ({
4847 existingDeployment,
4948 returnRoute,
5049 cancelReturnRoute,
51- headerAction,
52- viewMode = 'form' ,
53- onModelServerChange,
5450} ) => {
51+ const [ viewMode , setViewMode ] = React . useState < 'form' | 'yaml-preview' | 'yaml-edit' > ( 'form' ) ;
52+ const isYAMLViewerEnabled = useIsAreaAvailable ( SupportedArea . YAML_VIEWER ) . status ;
5553 const onRefresh = useRefreshWizardPage ( existingDeployment ) ;
5654 const { isExitModalOpen, openExitModal, closeExitModal, handleExitConfirm, exitWizardOnSubmit } =
5755 useExitDeploymentWizard ( { returnRoute, cancelReturnRoute } ) ;
@@ -63,12 +61,6 @@ const ModelDeploymentWizard: React.FC<ModelDeploymentWizardProps> = ({
6361 const validation = useModelDeploymentWizardValidation ( wizardState . state , wizardState . fields ) ;
6462 const currentProjectName = wizardState . state . project . projectName ?? undefined ;
6563
66- React . useEffect ( ( ) => {
67- if ( onModelServerChange ) {
68- onModelServerChange ( wizardState . state . modelServer . data ?. name ) ;
69- }
70- } , [ wizardState . state . modelServer . data ?. name , onModelServerChange ] ) ;
71-
7264 const { deployMethod, deployMethodLoaded } = useDeployMethod ( wizardState . state ) ;
7365 // TODO in same jira, replace deployMethod with applyFieldData for all other fields
7466 const { applyFieldData, applyExtensionsLoaded } = useWizardFieldApply ( wizardState . state ) ;
@@ -212,7 +204,26 @@ const ModelDeploymentWizard: React.FC<ModelDeploymentWizardProps> = ({
212204 description = { description }
213205 loaded
214206 empty = { false }
215- headerAction = { headerAction }
207+ headerAction = {
208+ isYAMLViewerEnabled ? (
209+ < ToggleGroup aria-label = "Deployment view mode" >
210+ < ToggleGroupItem
211+ data-testid = "form-view"
212+ text = "Form"
213+ buttonId = "form-view"
214+ isSelected = { viewMode === 'form' }
215+ onChange = { ( ) => setViewMode ( 'form' ) }
216+ />
217+ < ToggleGroupItem
218+ data-testid = "yaml-view"
219+ text = "YAML"
220+ buttonId = "yaml-view"
221+ isSelected = { viewMode === 'yaml-preview' }
222+ onChange = { ( ) => setViewMode ( 'yaml-preview' ) }
223+ />
224+ </ ToggleGroup >
225+ ) : undefined
226+ }
216227 >
217228 < ExternalDataLoader
218229 fields = { wizardState . fields }
@@ -229,74 +240,88 @@ const ModelDeploymentWizard: React.FC<ModelDeploymentWizardProps> = ({
229240 startIndex = { wizardState . initialData ?. wizardStartIndex ?? 1 }
230241 >
231242 < WizardStep name = { WizardStepTitle . MODEL_DETAILS } id = "source-model-step" >
232- { viewMode === 'yaml-preview' ? (
233- < DeploymentWizardYAMLView />
234- ) : wizardState . loaded . modelSourceLoaded ? (
235- < ModelSourceStepContent
236- wizardState = { wizardState }
237- validation = { validation . modelSource }
238- />
239- ) : (
240- < Spinner data-testid = "spinner" />
241- ) }
243+ < StepContentToggle
244+ viewMode = { viewMode }
245+ yamlView = { < DeploymentWizardYAMLView /> }
246+ contentView = {
247+ wizardState . loaded . modelSourceLoaded ? (
248+ < ModelSourceStepContent
249+ wizardState = { wizardState }
250+ validation = { validation . modelSource }
251+ />
252+ ) : (
253+ < Spinner data-testid = "spinner" />
254+ )
255+ }
256+ />
242257 </ WizardStep >
243258 < WizardStep
244259 name = { WizardStepTitle . MODEL_DEPLOYMENT }
245260 id = "model-deployment-step"
246- isDisabled = { viewMode === 'form' && ! validation . isModelSourceStepValid }
261+ isDisabled = { ! validation . isModelSourceStepValid }
247262 >
248- { viewMode === 'yaml-preview' ? (
249- < DeploymentWizardYAMLView />
250- ) : wizardState . loaded . modelDeploymentLoaded ? (
251- < ModelDeploymentStepContent
252- projectName = { currentProjectName }
253- wizardState = { wizardState }
254- />
255- ) : (
256- < Spinner data-testid = "spinner" />
257- ) }
263+ < StepContentToggle
264+ viewMode = { viewMode }
265+ yamlView = { < DeploymentWizardYAMLView /> }
266+ contentView = {
267+ wizardState . loaded . modelDeploymentLoaded ? (
268+ < ModelDeploymentStepContent
269+ projectName = { currentProjectName }
270+ wizardState = { wizardState }
271+ />
272+ ) : (
273+ < Spinner data-testid = "spinner" />
274+ )
275+ }
276+ />
258277 </ WizardStep >
259278 < WizardStep
260279 name = { WizardStepTitle . ADVANCED_SETTINGS }
261280 id = "advanced-options-step"
262281 isDisabled = {
263- viewMode === 'form' &&
264- ( ! validation . isModelSourceStepValid || ! validation . isModelDeploymentStepValid )
282+ ! validation . isModelSourceStepValid || ! validation . isModelDeploymentStepValid
265283 }
266284 >
267- { viewMode === 'yaml-preview' ? (
268- < DeploymentWizardYAMLView />
269- ) : wizardState . loaded . advancedOptionsLoaded ? (
270- < AdvancedSettingsStepContent
271- wizardState = { wizardState }
272- projectName = { currentProjectName }
273- externalData = { externalData }
274- />
275- ) : (
276- < Spinner data-testid = "spinner" />
277- ) }
285+ < StepContentToggle
286+ viewMode = { viewMode }
287+ yamlView = { < DeploymentWizardYAMLView /> }
288+ contentView = {
289+ wizardState . loaded . advancedOptionsLoaded ? (
290+ < AdvancedSettingsStepContent
291+ wizardState = { wizardState }
292+ projectName = { currentProjectName }
293+ externalData = { externalData }
294+ />
295+ ) : (
296+ < Spinner data-testid = "spinner" />
297+ )
298+ }
299+ />
278300 </ WizardStep >
279301 < WizardStep
280302 name = { WizardStepTitle . REVIEW }
281303 id = "summary-step"
282304 isDisabled = {
283- viewMode === 'form' &&
284- ( ! validation . isModelSourceStepValid ||
285- ! validation . isModelDeploymentStepValid ||
286- ! validation . isAdvancedSettingsStepValid )
305+ ! validation . isModelSourceStepValid ||
306+ ! validation . isModelDeploymentStepValid ||
307+ ! validation . isAdvancedSettingsStepValid
287308 }
288309 >
289- { viewMode === 'yaml-preview' ? (
290- < DeploymentWizardYAMLView />
291- ) : wizardState . loaded . summaryLoaded ? (
292- < ReviewStepContent
293- wizardState = { wizardState }
294- projectName = { currentProjectName }
295- externalData = { externalData }
296- />
297- ) : (
298- < Spinner data-testid = "spinner" />
299- ) }
310+ < StepContentToggle
311+ viewMode = { viewMode }
312+ yamlView = { < DeploymentWizardYAMLView /> }
313+ contentView = {
314+ wizardState . loaded . summaryLoaded ? (
315+ < ReviewStepContent
316+ wizardState = { wizardState }
317+ projectName = { currentProjectName }
318+ externalData = { externalData }
319+ />
320+ ) : (
321+ < Spinner data-testid = "spinner" />
322+ )
323+ }
324+ />
300325 </ WizardStep >
301326 </ Wizard >
302327 </ ApplicationsPage >
0 commit comments