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 ) ; 
@@ -75,10 +88,12 @@ export const WorkspaceKindForm: React.FC = () => {
7588      if  ( err  instanceof  ErrorEnvelopeException )  { 
7689        const  validationErrors  =  err . envelope . error ?. cause ?. validation_errors ; 
7790        if  ( validationErrors  &&  validationErrors . length  >  0 )  { 
78-           setSpecErrors ( validationErrors ) ; 
91+           setSpecErrors ( ( prev )   =>   [ ... prev ,  ... validationErrors ] ) ; 
7992          setValidated ( 'error' ) ; 
8093          return ; 
8194        } 
95+         setSpecErrors ( ( prev )  =>  [ ...prev ,  err ] ) ; 
96+         setValidated ( 'error' ) ; 
8297      } 
8398      // TODO: alert user about error 
8499      console . error ( `Error ${ mode  ===  'edit'  ? 'editing'  : 'creating' } ${ err }  ) ; 
@@ -96,6 +111,18 @@ export const WorkspaceKindForm: React.FC = () => {
96111    navigate ( 'workspaceKinds' ) ; 
97112  } ,  [ navigate ] ) ; 
98113
114+   if  ( mode  ===  'edit'  &&  initialFormDataError )  { 
115+     return  ( 
116+       < EmptyState 
117+         titleText = "Error loading workspace kind data" 
118+         headingLevel = "h4" 
119+         icon = { ExclamationCircleIcon } 
120+         status = "danger" 
121+       > 
122+         < EmptyStateBody > { initialFormDataError . message } </ EmptyStateBody > 
123+       </ EmptyState > 
124+     ) ; 
125+   } 
99126  return  ( 
100127    < > 
101128      < PageGroup  isFilled = { false }  stickyOnBreakpoint = { {  default : 'top'  } } > 
@@ -159,6 +186,12 @@ export const WorkspaceKindForm: React.FC = () => {
159186                setData ( 'podConfig' ,  podConfig ) ; 
160187              } } 
161188            /> 
189+             < WorkspaceKindFormPodTemplate 
190+               podTemplate = { data . podTemplate } 
191+               updatePodTemplate = { ( podTemplate )  =>  { 
192+                 setData ( 'podTemplate' ,  podTemplate ) ; 
193+               } } 
194+             /> 
162195          </ > 
163196        ) } 
164197      </ PageSection > 
@@ -171,7 +204,7 @@ export const WorkspaceKindForm: React.FC = () => {
171204              onClick = { handleSubmit } 
172205              isDisabled = { ! canSubmit } 
173206            > 
174-               { mode  ===  'create'  ? 'Create'  : 'Edit ' } 
207+               { mode  ===  'create'  ? 'Create'  : 'Save ' } 
175208            </ Button > 
176209          </ FlexItem > 
177210          < FlexItem > 
0 commit comments