@@ -6,10 +6,11 @@ import cn from 'classnames';
66import { Box , Link , WizardProps } from '@cloudscape-design/components' ;
77import { CardsProps } from '@cloudscape-design/components/cards' ;
88
9- import { Container , FormCodeEditor , FormField , FormSelect , SpaceBetween , Wizard } from 'components' ;
9+ import { Container , FormCards , FormCodeEditor , FormField , FormSelect , FormSelectProps , SpaceBetween , Wizard } from 'components' ;
1010
1111import { useBreadcrumbs , useNotifications } from 'hooks' ;
1212import { useCheckingForFleetsInProjects } from 'hooks/useCheckingForFleetsInProjectsOfMember' ;
13+ import { useLocalStorageState } from 'hooks/useLocalStorageState' ;
1314import { useProjectFilter } from 'hooks/useProjectFilter' ;
1415import { getServerError } from 'libs' ;
1516import { ROUTES } from 'routes' ;
@@ -45,6 +46,10 @@ export const CreateDevEnvironment: React.FC = () => {
4546 const [ searchParams ] = useSearchParams ( ) ;
4647 const navigate = useNavigate ( ) ;
4748 const [ pushNotification ] = useNotifications ( ) ;
49+ const [ defaultProject , setDefaultProject ] = useLocalStorageState < IProject [ 'project_name' ] | undefined > (
50+ 'createEnvironmentDefaultProject' ,
51+ undefined ,
52+ ) ;
4853 const [ activeStepIndex , setActiveStepIndex ] = useState ( 0 ) ;
4954 const [ selectedOffers , setSelectedOffers ] = useState < IGpu [ ] > ( [ ] ) ;
5055 const [ selectedTemplate , setSelectedTemplate ] = useState < ITemplate | undefined > ( ) ;
@@ -74,9 +79,11 @@ export const CreateDevEnvironment: React.FC = () => {
7479 } ,
7580 } ) ;
7681
77- const { handleSubmit, control, trigger, setValue, watch, formState, getValues } = formMethods ;
82+ const { handleSubmit, control, trigger, setValue, watch, formState, getValues, unregister } = formMethods ;
7883 const formValues = watch ( ) ;
7984
85+ console . log ( { formValues } ) ;
86+
8087 const projectHavingFleetMap = useCheckingForFleetsInProjects ( {
8188 projectNames : formValues . project ? [ formValues . project ] : [ ] ,
8289 } ) ;
@@ -101,7 +108,14 @@ export const CreateDevEnvironment: React.FC = () => {
101108 } , [ templatesData ] ) ;
102109
103110 useEffect ( ( ) => {
104- setSelectedTemplate ( templatesData ?. find ( ( t ) => t . id === formValues . template ) ) ;
111+ if ( ! defaultProject && projectOptions ?. [ 0 ] ?. value ) {
112+ setValue ( FORM_FIELD_NAMES . project , projectOptions [ 0 ] . value ) ;
113+ setDefaultProject ( projectOptions [ 0 ] . value ) ;
114+ }
115+ } , [ defaultProject , projectOptions ] ) ;
116+
117+ useEffect ( ( ) => {
118+ setSelectedTemplate ( templatesData ?. find ( ( t ) => t . id === formValues . template ?. [ 0 ] ) ) ;
105119 } , [ templatesData , formValues . template ] ) ;
106120
107121 const validateProjectAndTemplate = async ( ) => await trigger ( templateStepFieldNames ) ;
@@ -130,6 +144,8 @@ export const CreateDevEnvironment: React.FC = () => {
130144 window . scrollTo ( 0 , 0 ) ;
131145 }
132146 } ) ;
147+ } else if ( reason === 'step' && requestedStepIndex - activeStepIndex > 1 ) {
148+ return ;
133149 } else {
134150 setActiveStepIndex ( requestedStepIndex ) ;
135151 }
@@ -139,6 +155,15 @@ export const CreateDevEnvironment: React.FC = () => {
139155 onNavigate ( { requestedStepIndex, reason } ) ;
140156 } ;
141157
158+ const onChangeProject : FormSelectProps < IRunEnvironmentFormValues > [ 'onChange' ] = ( { detail } ) => {
159+ setValue ( FORM_FIELD_NAMES . template , [ ] ) ;
160+ setDefaultProject ( detail . selectedOption . value ) ;
161+ } ;
162+
163+ const onChangeTemplate = ( ) => {
164+ unregister ( FORM_FIELD_NAMES . ide ) ;
165+ } ;
166+
142167 const onChangeOffer : CardsProps < IGpu > [ 'onSelectionChange' ] = ( { detail } ) => {
143168 const newSelectedOffers = detail ?. selectedItems ?? [ ] ;
144169 setSelectedOffers ( newSelectedOffers ) ;
@@ -245,22 +270,27 @@ export const CreateDevEnvironment: React.FC = () => {
245270 empty = { t ( 'runs.dev_env.wizard.project_empty' ) }
246271 loadingText = { t ( 'runs.dev_env.wizard.project_loading' ) }
247272 statusType = { isLoadingProjectOptions ? 'loading' : undefined }
248- onChange = { ( ) => setValue ( FORM_FIELD_NAMES . template , '' ) }
273+ onChange = { onChangeProject }
274+ defaultValue = { defaultProject }
249275 />
250276
251- < FormSelect
277+ < FormField
252278 label = { t ( 'runs.dev_env.wizard.template' ) }
253279 description = { t ( 'runs.dev_env.wizard.template_description' ) }
254- placeholder = {
255- ! formValues . project ? t ( 'runs.dev_env.wizard.template_placeholder' ) : undefined
256- }
280+ errorText = { formState . errors . template ?. message }
281+ />
282+
283+ < FormCards
257284 control = { control }
258285 name = { FORM_FIELD_NAMES . template }
259- options = { templateOptions }
260- disabled = { loading }
261- empty = { t ( 'runs.dev_env.wizard.template_empty' ) }
262- loadingText = { t ( 'runs.dev_env.wizard.template_loading' ) }
263- statusType = { isLoadingTemplates ? 'loading' : undefined }
286+ items = { templateOptions }
287+ selectionType = "single"
288+ loading = { isLoadingTemplates }
289+ cardDefinition = { {
290+ header : ( item ) => item . label ,
291+ } }
292+ cardsPerRow = { [ { cards : 1 } , { minWidth : 400 , cards : 2 } , { minWidth : 800 , cards : 3 } ] }
293+ onSelectionChange = { onChangeTemplate }
264294 />
265295 </ SpaceBetween >
266296 </ Container >
@@ -285,6 +315,7 @@ export const CreateDevEnvironment: React.FC = () => {
285315 selectedItems = { selectedOffers }
286316 onSelectionChange = { onChangeOffer }
287317 permanentFilters = { { project_name : formValues . project ?? '' } }
318+ defaultFilters = { { spot_policy : 'on-demand' } }
288319 />
289320 </ >
290321 ) ,
0 commit comments