1- import  React ,  {  useCallback ,  useMemo ,  useState  }  from  'react' ; 
1+ import  React ,  {  useCallback ,  useEffect ,   useMemo ,  useState  }  from  'react' ; 
22import  { 
33  Button , 
44  Content , 
55  ContentVariants , 
6+   EmptyState , 
7+   EmptyStateBody , 
68  Flex , 
79  FlexItem , 
810  PageGroup , 
@@ -11,18 +13,22 @@ import {
1113  StackItem , 
1214}  from  '@patternfly/react-core' ; 
1315import  {  t_global_spacer_sm  as  SmallPadding  }  from  '@patternfly/react-tokens' ; 
16+ import  {  ExclamationCircleIcon  }  from  '@patternfly/react-icons' ; 
1417import  {  ValidationErrorAlert  }  from  '~/app/components/ValidationErrorAlert' ; 
15- import  {  useTypedNavigate  }  from  '~/app/routerHelper' ; 
18+ import  useWorkspaceKindByName  from  '~/app/hooks/useWorkspaceKindByName' ; 
19+ import  {  WorkspaceKind ,  ValidationError  }  from  '~/shared/api/backendApiTypes' ; 
20+ import  {  useTypedNavigate ,  useTypedParams  }  from  '~/app/routerHelper' ; 
1621import  {  useCurrentRouteKey  }  from  '~/app/hooks/useCurrentRouteKey' ; 
1722import  useGenericObjectState  from  '~/app/hooks/useGenericObjectState' ; 
1823import  {  useNotebookAPI  }  from  '~/app/hooks/useNotebookAPI' ; 
1924import  {  WorkspaceKindFormData  }  from  '~/app/types' ; 
2025import  {  ErrorEnvelopeException  }  from  '~/shared/api/apiUtils' ; 
21- import  {  ValidationError  }  from  '~/shared/api/backendApiTypes' ; 
2226import  {  WorkspaceKindFileUpload  }  from  './fileUpload/WorkspaceKindFileUpload' ; 
2327import  {  WorkspaceKindFormProperties  }  from  './properties/WorkspaceKindFormProperties' ; 
2428import  {  WorkspaceKindFormImage  }  from  './image/WorkspaceKindFormImage' ; 
2529import  {  WorkspaceKindFormPodConfig  }  from  './podConfig/WorkspaceKindFormPodConfig' ; 
30+ import  {  WorkspaceKindFormPodTemplate  }  from  './podTemplate/WorkspaceKindFormPodTemplate' ; 
31+ import  {  EMPTY_WORKSPACE_KIND_FORM_DATA  }  from  './helpers' ; 
2632
2733export  enum  WorkspaceKindFormView  { 
2834  Form , 
@@ -31,6 +37,18 @@ export enum WorkspaceKindFormView {
3137
3238export  type  ValidationStatus  =  'success'  |  'error'  |  'default' ; 
3339
40+ const  convertToFormData  =  ( initialData : WorkspaceKind ) : WorkspaceKindFormData  =>  { 
41+   const  {  podTemplate,  ...properties  }  =  initialData ; 
42+   const  {  options,  ...spec  }  =  podTemplate ; 
43+   const  {  podConfig,  imageConfig }  =  options ; 
44+   return  { 
45+     properties, 
46+     podConfig, 
47+     imageConfig, 
48+     podTemplate : spec , 
49+   } ; 
50+ } ; 
51+ 
3452export  const  WorkspaceKindForm : React . FC  =  ( )  =>  { 
3553  const  navigate  =  useTypedNavigate ( ) ; 
3654  const  {  api }  =  useNotebookAPI ( ) ; 
@@ -39,27 +57,22 @@ export const WorkspaceKindForm: React.FC = () => {
3957  const  [ isSubmitting ,  setIsSubmitting ]  =  useState ( false ) ; 
4058  const  [ validated ,  setValidated ]  =  useState < ValidationStatus > ( 'default' ) ; 
4159  const  mode  =  useCurrentRouteKey ( )  ===  'workspaceKindCreate'  ? 'create'  : 'edit' ; 
42-   const  [ specErrors ,  setSpecErrors ]  =  useState < ValidationError [ ] > ( [ ] ) ; 
60+   const  [ specErrors ,  setSpecErrors ]  =  useState < ( ValidationError  |  ErrorEnvelopeException ) [ ] > ( [ ] ) ; 
61+ 
62+   const  {  kind }  =  useTypedParams < 'workspaceKindEdit' > ( ) ; 
63+   const  [ initialFormData ,  initialFormDataLoaded ,  initialFormDataError ]  = 
64+     useWorkspaceKindByName ( kind ) ; 
65+ 
66+   const  [ data ,  setData ,  resetData ,  replaceData ]  =  useGenericObjectState < WorkspaceKindFormData > ( 
67+     initialFormData  ? convertToFormData ( initialFormData )  : EMPTY_WORKSPACE_KIND_FORM_DATA , 
68+   ) ; 
4369
44-   const  [ data ,  setData ,  resetData ]  =  useGenericObjectState < WorkspaceKindFormData > ( { 
45-     properties : { 
46-       displayName : '' , 
47-       description : '' , 
48-       deprecated : false , 
49-       deprecationMessage : '' , 
50-       hidden : false , 
51-       icon : {  url : ''  } , 
52-       logo : {  url : ''  } , 
53-     } , 
54-     imageConfig : { 
55-       default : '' , 
56-       values : [ ] , 
57-     } , 
58-     podConfig : { 
59-       default : '' , 
60-       values : [ ] , 
61-     } , 
62-   } ) ; 
70+   useEffect ( ( )  =>  { 
71+     if  ( ! initialFormDataLoaded  ||  initialFormData  ===  null  ||  mode  ===  'create' )  { 
72+       return ; 
73+     } 
74+     replaceData ( convertToFormData ( initialFormData ) ) ; 
75+   } ,  [ initialFormData ,  initialFormDataLoaded ,  mode ,  replaceData ] ) ; 
6376
6477  const  handleSubmit  =  useCallback ( async  ( )  =>  { 
6578    setIsSubmitting ( true ) ; 
@@ -71,14 +84,20 @@ export const WorkspaceKindForm: React.FC = () => {
7184        console . info ( 'New workspace kind created:' ,  JSON . stringify ( newWorkspaceKind ) ) ; 
7285        navigate ( 'workspaceKinds' ) ; 
7386      } 
87+       // TODO: Finish when WSKind API is finalized 
88+       // const updatedWorkspace = await api.updateWorkspaceKind({}, kind, { data: {}  }); 
89+       // console.info('Workspace Kind updated:', JSON.stringify(updatedWorkspace)); 
90+       // navigate('workspaceKinds'); 
7491    }  catch  ( err )  { 
7592      if  ( err  instanceof  ErrorEnvelopeException )  { 
7693        const  validationErrors  =  err . envelope . error ?. cause ?. validation_errors ; 
7794        if  ( validationErrors  &&  validationErrors . length  >  0 )  { 
78-           setSpecErrors ( validationErrors ) ; 
95+           setSpecErrors ( ( prev )   =>   [ ... prev ,  ... validationErrors ] ) ; 
7996          setValidated ( 'error' ) ; 
8097          return ; 
8198        } 
99+         setSpecErrors ( ( prev )  =>  [ ...prev ,  err ] ) ; 
100+         setValidated ( 'error' ) ; 
82101      } 
83102      // TODO: alert user about error 
84103      console . error ( `Error ${ mode  ===  'edit'  ? 'editing'  : 'creating' } ${ err }  ) ; 
@@ -88,14 +107,26 @@ export const WorkspaceKindForm: React.FC = () => {
88107  } ,  [ navigate ,  mode ,  api ,  yamlValue ] ) ; 
89108
90109  const  canSubmit  =  useMemo ( 
91-     ( )  =>  ! isSubmitting  &&  yamlValue . length   >   0   &&   validated  ===  'success' , 
92-     [ yamlValue ,   isSubmitting ,  validated ] , 
110+     ( )  =>  ! isSubmitting  &&  validated  ===  'success' , 
111+     [ isSubmitting ,  validated ] , 
93112  ) ; 
94113
95114  const  cancel  =  useCallback ( ( )  =>  { 
96115    navigate ( 'workspaceKinds' ) ; 
97116  } ,  [ navigate ] ) ; 
98117
118+   if  ( mode  ===  'edit'  &&  initialFormDataError )  { 
119+     return  ( 
120+       < EmptyState 
121+         titleText = "Error loading Workspace Kind data" 
122+         headingLevel = "h4" 
123+         icon = { ExclamationCircleIcon } 
124+         status = "danger" 
125+       > 
126+         < EmptyStateBody > { initialFormDataError . message } </ EmptyStateBody > 
127+       </ EmptyState > 
128+     ) ; 
129+   } 
99130  return  ( 
100131    < > 
101132      < PageGroup  isFilled = { false }  stickyOnBreakpoint = { {  default : 'top'  } } > 
@@ -159,6 +190,12 @@ export const WorkspaceKindForm: React.FC = () => {
159190                setData ( 'podConfig' ,  podConfig ) ; 
160191              } } 
161192            /> 
193+             < WorkspaceKindFormPodTemplate 
194+               podTemplate = { data . podTemplate } 
195+               updatePodTemplate = { ( podTemplate )  =>  { 
196+                 setData ( 'podTemplate' ,  podTemplate ) ; 
197+               } } 
198+             /> 
162199          </ > 
163200        ) } 
164201      </ PageSection > 
@@ -169,9 +206,10 @@ export const WorkspaceKindForm: React.FC = () => {
169206              variant = "primary" 
170207              ouiaId = "Primary" 
171208              onClick = { handleSubmit } 
172-               isDisabled = { ! canSubmit } 
209+               // TODO: button is always disabled on edit mode. Need to modify when WorkspaceKind edit is finalized 
210+               isDisabled = { ! canSubmit  ||  mode  ===  'edit' } 
173211            > 
174-               { mode  ===  'create'  ? 'Create'  : 'Edit ' } 
212+               { mode  ===  'create'  ? 'Create'  : 'Save ' } 
175213            </ Button > 
176214          </ FlexItem > 
177215          < FlexItem > 
0 commit comments