From 240e43757d13a8f2b986bca8db7ae2b231f87a5b Mon Sep 17 00:00:00 2001 From: jgyselov Date: Thu, 20 Mar 2025 10:43:58 +0100 Subject: [PATCH] CIM CPU architectures rework --- .../ClusterDeploymentDetailsForm.tsx | 4 +- .../ClusterDetailsFormFields.tsx | 4 +- .../common/CpuArchitectureDropdown.tsx | 91 +++++++++++-------- 3 files changed, 55 insertions(+), 44 deletions(-) diff --git a/libs/ui-lib/lib/cim/components/ClusterDeployment/ClusterDeploymentDetailsForm.tsx b/libs/ui-lib/lib/cim/components/ClusterDeployment/ClusterDeploymentDetailsForm.tsx index ae7e3e0d2d..73be0b8cae 100644 --- a/libs/ui-lib/lib/cim/components/ClusterDeployment/ClusterDeploymentDetailsForm.tsx +++ b/libs/ui-lib/lib/cim/components/ClusterDeployment/ClusterDeploymentDetailsForm.tsx @@ -17,7 +17,7 @@ import { ClusterDetailsFormFieldsProps, } from './ClusterDetailsFormFields'; import { useFormikContext } from 'formik'; -import { ClusterDetailsValues, CpuArchitecture } from '../../../common'; +import { ClusterDetailsValues, CpuArchitecture, SupportedCpuArchitecture } from '../../../common'; import { ClusterDeploymentWizardContext } from './ClusterDeploymentWizardContext'; import { ValidationSection } from './components/ValidationSection'; import { toNumber } from 'lodash-es'; @@ -117,7 +117,7 @@ const ClusterDeploymentDetailsForm: React.FC const highlyAvailableSupported = toNumber(version?.version?.split('.')?.[1]) >= 18; return [ - isMulti ? cpuArchitectures : version?.cpuArchitectures, + (isMulti ? cpuArchitectures : version?.cpuArchitectures) as SupportedCpuArchitecture[], highlyAvailableSupported && !isMulti, ]; }, [allVersions, values.openshiftVersion]); diff --git a/libs/ui-lib/lib/cim/components/ClusterDeployment/ClusterDetailsFormFields.tsx b/libs/ui-lib/lib/cim/components/ClusterDeployment/ClusterDetailsFormFields.tsx index fabe90dd4d..dc231fde5f 100644 --- a/libs/ui-lib/lib/cim/components/ClusterDeployment/ClusterDetailsFormFields.tsx +++ b/libs/ui-lib/lib/cim/components/ClusterDeployment/ClusterDetailsFormFields.tsx @@ -5,7 +5,7 @@ import { useFormikContext } from 'formik'; import { OpenShiftVersionDropdown, OpenShiftVersionModal } from '../../../common'; import { StaticTextField } from '../../../common/components/ui/StaticTextField'; import { PullSecret } from '../../../common/components/clusters'; -import { OpenshiftVersionOptionType } from '../../../common/types'; +import { OpenshiftVersionOptionType, SupportedCpuArchitecture } from '../../../common/types'; import { InputField, RichInputField, @@ -23,7 +23,7 @@ export type ClusterDetailsFormFieldsProps = { versions: OpenshiftVersionOptionType[]; allVersions: OpenshiftVersionOptionType[]; isNutanix?: boolean; - cpuArchitectures?: string[]; + cpuArchitectures?: SupportedCpuArchitecture[]; allowHighlyAvailable?: boolean; }; diff --git a/libs/ui-lib/lib/cim/components/common/CpuArchitectureDropdown.tsx b/libs/ui-lib/lib/cim/components/common/CpuArchitectureDropdown.tsx index 360ffcd555..3f5ca415bb 100644 --- a/libs/ui-lib/lib/cim/components/common/CpuArchitectureDropdown.tsx +++ b/libs/ui-lib/lib/cim/components/common/CpuArchitectureDropdown.tsx @@ -1,6 +1,5 @@ import * as React from 'react'; -import { FormGroup } from '@patternfly/react-core'; -import { Dropdown, DropdownItem, DropdownToggle } from '@patternfly/react-core/deprecated'; +import { Dropdown, DropdownItem, FormGroup, MenuToggle } from '@patternfly/react-core'; import { useTranslation } from '../../../common/hooks/use-translation-wrapper'; import { architectureData, @@ -12,30 +11,18 @@ import { import { useField } from 'formik'; import { useFormikHelpers } from '../../../common/hooks/useFormikHelpers'; -const allDropdownItems = { - [CpuArchitecture.x86]: ( - - {architectureData['x86_64'].label} - - ), - [CpuArchitecture.ARM]: ( - - {architectureData['arm64'].label} - - ), - [CpuArchitecture.s390x]: ( - - {architectureData['s390x'].label} - - ), -}; +const cimCpuArchitectures = [ + CpuArchitecture.x86, + CpuArchitecture.ARM, + CpuArchitecture.s390x, +] as SupportedCpuArchitecture[]; const CpuArchitectureDropdown = ({ isDisabled = false, cpuArchitectures, }: { isDisabled?: boolean; - cpuArchitectures?: string[]; + cpuArchitectures?: SupportedCpuArchitecture[]; }) => { const { t } = useTranslation(); const [{ name, value }, , { setValue }] = useField( @@ -45,7 +32,7 @@ const CpuArchitectureDropdown = ({ const fieldId = getFieldId(name, 'input'); const { setValue: setUserManagedNetworking } = useFormikHelpers('userManagedNetworking'); - const onCpuArchSelect = (e?: React.SyntheticEvent) => { + const onCpuArchSelect = (e?: React.MouseEvent) => { const val = e?.currentTarget.id as SupportedCpuArchitecture; setValue(val); setUserManagedNetworking(val === CpuArchitecture.s390x); @@ -53,36 +40,60 @@ const CpuArchitectureDropdown = ({ setCpuArchOpen(false); }; - const dropdownItems = React.useMemo(() => { - if (!cpuArchitectures) { - return Object.values(allDropdownItems); - } else { - return Object.entries(allDropdownItems) - .filter(([key, _]) => cpuArchitectures.includes(key)) - .map(([_, val]) => val); - } - }, [cpuArchitectures]); + const dropdownItems = React.useMemo( + () => + cimCpuArchitectures.map((arch) => { + const isItemEnabled = !cpuArchitectures || cpuArchitectures.includes(arch); + const disabledReason = t( + 'ai:This option is not available with the selected OpenShift version', + ); + return ( + e.preventDefault()} + > + {architectureData[arch].label} + + ); + }), + [cpuArchitectures, t, value], + ); React.useEffect(() => { if (!isDisabled && value !== '' && cpuArchitectures && !cpuArchitectures?.includes(value)) { - setValue(''); + const defaultVal = cpuArchitectures?.[0] || CpuArchitecture.x86; + setValue(defaultVal); } }, [cpuArchitectures, isDisabled, setValue, value]); return !isDisabled ? ( - + setCpuArchOpen(!cpuArchOpen)} className="pf-u-w-100"> + toggle={(toggleRef) => ( + setCpuArchOpen(!cpuArchOpen)} + className="pf-u-w-100" + > {value ? architectureData[value].label : t('ai:CPU architecture')} - - } - name="cpuArchitecture" + + )} isOpen={cpuArchOpen} onSelect={onCpuArchSelect} - dropdownItems={dropdownItems} - className="pf-u-w-100" - /> + > + {dropdownItems} + ) : (