@@ -4,81 +4,75 @@ import {
44 FormGroup ,
55 FormHelperText ,
66 HelperTextItem ,
7- Button ,
87 DropdownItem ,
98 MenuToggle ,
109 MenuToggleElement ,
1110 Dropdown ,
1211 DropdownGroup ,
1312 Divider ,
13+ DropdownProps ,
1414} from '@patternfly/react-core' ;
1515
1616import { OpenshiftVersionOptionType } from '../../types' ;
1717import { useTranslation } from '../../hooks/use-translation-wrapper' ;
18- import { useField , useFormikContext } from 'formik' ;
18+ import { useField } from 'formik' ;
1919import { getFieldId } from './formik' ;
2020import ExternalLink from './ExternalLink' ;
2121import { OCP_RELEASES_PAGE } from '../../config' ;
22- import { ClusterDetailsValues , ItemDropdown } from '../clusterWizard ' ;
22+ import { getVersionLabel } from './utils ' ;
2323
2424export type HelperTextType = ( value : string | null , inModal ?: boolean ) => JSX . Element | null ;
2525
2626type OpenShiftVersionDropdownProps = {
2727 name : string ;
28- items : ItemDropdown ;
2928 versions : OpenshiftVersionOptionType [ ] ;
3029 getHelperText ?: HelperTextType ;
3130 showReleasesLink : boolean ;
3231 showOpenshiftVersionModal : ( ) => void ;
33- customItem ?: OpenshiftVersionOptionType ;
32+ customVersion ?: OpenshiftVersionOptionType ;
3433} ;
3534
36- const getParsedVersions = ( items : ItemDropdown ) => {
35+ const getParsedVersions = ( items : OpenshiftVersionOptionType [ ] ) => {
3736 const versionsY = Array . from ( new Set ( items . map ( ( val ) => val . value . match ( / ^ \d + \. ( \d + ) / ) ?. [ 1 ] ) ) ) ;
3837
3938 const parsedVersions = versionsY . map ( ( y ) => ( {
4039 y : y ,
4140 versions : items . filter ( ( val ) => val . value . match ( / ^ \d + \. ( \d + ) / ) ?. [ 1 ] === y ) ,
4241 } ) ) ;
43- return { parsedVersions : parsedVersions . reverse ( ) } ;
42+ return parsedVersions . reverse ( ) ;
4443} ;
4544export const OpenShiftVersionDropdown = ( {
4645 name,
47- items,
4846 versions,
4947 getHelperText,
5048 showReleasesLink,
5149 showOpenshiftVersionModal,
52- customItem ,
50+ customVersion ,
5351} : OpenShiftVersionDropdownProps ) => {
5452 const [ field , , { setValue } ] = useField < string > ( name ) ;
5553 const [ isOpen , setOpen ] = React . useState ( false ) ;
5654 const { t } = useTranslation ( ) ;
5755 const fieldId = getFieldId ( name , 'input' ) ;
58- const {
59- values : { customOpenshiftSelect } ,
60- } = useFormikContext < ClusterDetailsValues > ( ) ;
61- const [ current , setCurrent ] = React . useState < string > ( ) ;
56+
57+ const current = ( customVersion ? [ ... versions , customVersion ] : versions ) . find (
58+ ( item ) => item . value === field . value ,
59+ ) ;
6260
6361 React . useEffect ( ( ) => {
64- let defaultVersion = versions . find ( ( item ) => item . default ) ;
65- if ( customOpenshiftSelect && customItem ) {
66- defaultVersion = customItem ;
67- } else if ( customOpenshiftSelect ) {
68- defaultVersion = versions . find ( ( item ) => item . value === customOpenshiftSelect ) ;
62+ if ( ! field . value ) {
63+ const defaultVersion = versions . find ( ( item ) => item . default ) || versions [ 0 ] ;
64+ if ( defaultVersion ) {
65+ setValue ( defaultVersion . value ) ;
66+ }
6967 }
68+ } , [ field . value , versions , setValue ] ) ;
7069
71- setCurrent ( defaultVersion ?. label || '' ) ;
72- setValue ( defaultVersion ?. value || '' ) ;
73- // eslint-disable-next-line react-hooks/exhaustive-deps
74- } , [ customOpenshiftSelect ] ) ;
75-
76- const parsedVersionsForItems = getParsedVersions ( items ) ;
70+ const parsedVersions = getParsedVersions ( versions ) ;
7771 let lastY : string | undefined = '' ;
78- const dropdownItems = parsedVersionsForItems . parsedVersions . map ( ( { y, versions } ) => {
79- const items = versions . map ( ( { value , label } ) => (
80- < DropdownItem key = { value } id = { value } value = { value } >
81- { label }
72+ const dropdownItems = parsedVersions . map ( ( { y, versions } ) => {
73+ const items = versions . map ( ( version ) => (
74+ < DropdownItem key = { version . value } id = { version . value } value = { version . value } >
75+ { getVersionLabel ( version , t ) }
8276 </ DropdownItem >
8377 ) ) ;
8478
@@ -95,43 +89,24 @@ export const OpenShiftVersionDropdown = ({
9589 { dropdownItems }
9690 </ DropdownGroup >
9791 ) ,
98- customItem && (
92+ customVersion && (
9993 < DropdownGroup label = "Custom releases" key = "custom-releases" >
100- < DropdownItem key = { customItem . value } id = { customItem . value } value = { customItem . value } >
101- { customItem . label }
94+ < DropdownItem
95+ key = { customVersion . value }
96+ id = { customVersion . value }
97+ value = { customVersion . value }
98+ >
99+ { getVersionLabel ( customVersion , t ) }
102100 </ DropdownItem >
103101 </ DropdownGroup >
104102 ) ,
105103 < DropdownGroup key = "all-available-versions" >
106- < DropdownItem key = "all-versions" id = "all-versions" onSelect = { ( e ) => e . preventDefault ( ) } >
107- < Button
108- variant = "link"
109- isInline
110- onClick = { ( ) => {
111- setOpen ( false ) ;
112- showOpenshiftVersionModal ( ) ;
113- } }
114- id = "show-all-versions"
115- >
116- { t ( 'ai:Show all available versions' ) }
117- </ Button >
104+ < DropdownItem key = "all-versions" id = "all-versions" value = "all-versions" >
105+ < div className = "pf-v6-u-text-color-link" > { t ( 'ai:Show all available versions' ) } </ div >
118106 </ DropdownItem >
119107 </ DropdownGroup > ,
120108 ] . filter ( Boolean ) ;
121109
122- const onSelect = React . useCallback (
123- ( event ?: React . MouseEvent < Element , MouseEvent > , val ?: string | number ) => {
124- const newLabel = event ?. currentTarget . textContent ;
125- const newValue = ( val as string ) || '' ;
126- if ( newLabel && event . currentTarget . id !== 'all-versions' ) {
127- setCurrent ( newLabel ) ;
128- setValue ( newValue ) ;
129- setOpen ( false ) ;
130- }
131- } ,
132- [ setValue ] ,
133- ) ;
134-
135110 const dropdownToggle = ( toggleRef : React . Ref < MenuToggleElement > ) => (
136111 < MenuToggle
137112 id = { fieldId }
@@ -143,12 +118,21 @@ export const OpenShiftVersionDropdown = ({
143118 isExpanded = { isOpen }
144119 data-testid = "openshift-version-dropdown-toggle"
145120 >
146- { current || t ( 'ai:OpenShift version' ) }
121+ { current ? getVersionLabel ( current , t ) : t ( 'ai:OpenShift version' ) }
147122 </ MenuToggle >
148123 ) ;
149124
150125 const helperText = getHelperText && getHelperText ( field . value ) ;
151126
127+ const onSelect : DropdownProps [ 'onSelect' ] = ( _ , val ) => {
128+ if ( val === 'all-versions' ) {
129+ showOpenshiftVersionModal ( ) ;
130+ } else if ( val ) {
131+ setValue ( val as string ) ;
132+ }
133+ setOpen ( false ) ;
134+ } ;
135+
152136 return (
153137 < FormGroup
154138 id = { `form-control__${ fieldId } ` }
0 commit comments