From 5666501395c4526ac5b9dab7f7921c2a190037b1 Mon Sep 17 00:00:00 2001 From: Ashraf Masarwa Date: Mon, 18 Aug 2025 12:52:46 +0300 Subject: [PATCH 1/8] [Staging] [UI] - Machine network CIDR value should be mandatory --- .../FormViewNetworkWideFields.tsx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/libs/ui-lib/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.tsx b/libs/ui-lib/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.tsx index b40f5af887..9a34e99c0e 100644 --- a/libs/ui-lib/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.tsx +++ b/libs/ui-lib/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.tsx @@ -76,6 +76,20 @@ const MachineNetwork: React.FC<{ fieldName: string; protocolVersion: ProtocolVer const cidr = getMachineNetworkCidr(value); return getHumanizedSubnetRange(getAddressObject(cidr, protocolVersion)); }, [value, protocolVersion, errorMessage]); + + const handleValidatePrefixLength = (value: string) => { + if (!value || value === '') { + return 'Prefix length is required'; + } + if (Number(value) < MIN_PREFIX_LENGTH) { + return `Prefix length must be at least ${MIN_PREFIX_LENGTH}`; + } + if (Number(value) > MAX_PREFIX_LENGTH[protocolVersion]) { + return `Prefix length must be at most ${MAX_PREFIX_LENGTH[protocolVersion]}`; + } + return undefined; + } + const fieldId = getFieldId(`${fieldName}`, 'input'); return ( From dbe03bda3edbe68ad25ea5648adf5ed4612a5d54 Mon Sep 17 00:00:00 2001 From: Ashraf Masarwa Date: Mon, 18 Aug 2025 15:34:02 +0300 Subject: [PATCH 2/8] Run Prettier on changes --- .../FormViewNetworkWide/FormViewNetworkWideFields.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/ui-lib/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.tsx b/libs/ui-lib/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.tsx index 9a34e99c0e..c47f136e0b 100644 --- a/libs/ui-lib/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.tsx +++ b/libs/ui-lib/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.tsx @@ -88,7 +88,7 @@ const MachineNetwork: React.FC<{ fieldName: string; protocolVersion: ProtocolVer return `Prefix length must be at most ${MAX_PREFIX_LENGTH[protocolVersion]}`; } return undefined; - } + }; const fieldId = getFieldId(`${fieldName}`, 'input'); return ( From 94d2bd495f449320f62bb20bc944ee5b4512f507 Mon Sep 17 00:00:00 2001 From: Rastislav Wagner Date: Thu, 14 Aug 2025 10:24:06 +0200 Subject: [PATCH 3/8] ABI: Above sea level (#2971) --- .../lib/common/features/featureGate.tsx | 4 +- .../OcmOpenShiftVersion.tsx | 29 +++-- .../clusterWizard/ClusterDetails.tsx | 1 - .../clusterWizard/ClusterDetailsForm.tsx | 31 +++-- .../clusterWizard/ClusterWizardContext.tsx | 6 +- .../ClusterWizardContextProvider.tsx | 20 ++- .../clusterWizard/NewClusterWizard.tsx | 18 ++- .../ocm/components/clusterWizard/constants.ts | 2 + .../clusterWizard/disconnected/BasicStep.tsx | 88 +++++++++++++ .../clusterWizard/disconnected/ReviewStep.tsx | 123 ++++++++++++++++++ .../clusterWizard/wizardTransition.ts | 13 +- 11 files changed, 302 insertions(+), 33 deletions(-) create mode 100644 libs/ui-lib/lib/ocm/components/clusterWizard/disconnected/BasicStep.tsx create mode 100644 libs/ui-lib/lib/ocm/components/clusterWizard/disconnected/ReviewStep.tsx diff --git a/libs/ui-lib/lib/common/features/featureGate.tsx b/libs/ui-lib/lib/common/features/featureGate.tsx index c9775fff3c..fa356fee89 100644 --- a/libs/ui-lib/lib/common/features/featureGate.tsx +++ b/libs/ui-lib/lib/common/features/featureGate.tsx @@ -1,7 +1,9 @@ import React from 'react'; // Must conform Unleash constants -export type AssistedInstallerFeatureType = 'ASSISTED_INSTALLER_SINGLE_CLUSTER_FEATURE'; +export type AssistedInstallerFeatureType = + | 'ASSISTED_INSTALLER_SINGLE_CLUSTER_FEATURE' + | 'ASSISTED_INSTALLER_ABI'; export type FeatureListType = { [key in AssistedInstallerFeatureType]?: boolean; diff --git a/libs/ui-lib/lib/ocm/components/clusterConfiguration/OcmOpenShiftVersion.tsx b/libs/ui-lib/lib/ocm/components/clusterConfiguration/OcmOpenShiftVersion.tsx index 3e0036d7fc..c2cf548a58 100644 --- a/libs/ui-lib/lib/ocm/components/clusterConfiguration/OcmOpenShiftVersion.tsx +++ b/libs/ui-lib/lib/ocm/components/clusterConfiguration/OcmOpenShiftVersion.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import { Stack, StackItem } from '@patternfly/react-core'; import { ClusterCpuArchitecture, getOpenshiftVersionText, @@ -7,9 +8,9 @@ import { } from '../../../common'; type OcmOpenShiftVersionProps = { - versions: OpenshiftVersionOptionType[]; + versions?: OpenshiftVersionOptionType[]; openshiftVersion: string; - clusterCpuArchitecture: string | undefined; + clusterCpuArchitecture?: string; withPreviewText?: boolean; withMultiText?: boolean; }; @@ -20,17 +21,23 @@ const OcmOpenShiftVersion = ({ versions, withPreviewText, withMultiText, -}: OcmOpenShiftVersionProps) => { + children, +}: React.PropsWithChildren) => { return ( - OpenShift{' '} - {getOpenshiftVersionText({ - openshiftVersion, - cpuArchitecture: clusterCpuArchitecture as ClusterCpuArchitecture, - versions, - withPreviewText, - withMultiText, - })} + + + OpenShift{' '} + {getOpenshiftVersionText({ + openshiftVersion, + cpuArchitecture: clusterCpuArchitecture as ClusterCpuArchitecture, + versions, + withPreviewText, + withMultiText, + })} + + {children && {children}} + ); }; diff --git a/libs/ui-lib/lib/ocm/components/clusterWizard/ClusterDetails.tsx b/libs/ui-lib/lib/ocm/components/clusterWizard/ClusterDetails.tsx index 2d445a4d46..0a734f5d6c 100644 --- a/libs/ui-lib/lib/ocm/components/clusterWizard/ClusterDetails.tsx +++ b/libs/ui-lib/lib/ocm/components/clusterWizard/ClusterDetails.tsx @@ -132,7 +132,6 @@ const ClusterDetails = ({ cluster, infraEnv }: ClusterDetailsProps) => { managedDomains={managedDomains} ocpVersions={versions} usedClusterNames={usedClusterNames} - moveNext={() => clusterWizardContext.moveNext()} handleClusterUpdate={handleClusterUpdate} handleClusterCreate={handleClusterCreate} navigation={navigation} diff --git a/libs/ui-lib/lib/ocm/components/clusterWizard/ClusterDetailsForm.tsx b/libs/ui-lib/lib/ocm/components/clusterWizard/ClusterDetailsForm.tsx index 9b9f433e3e..8595284143 100644 --- a/libs/ui-lib/lib/ocm/components/clusterWizard/ClusterDetailsForm.tsx +++ b/libs/ui-lib/lib/ocm/components/clusterWizard/ClusterDetailsForm.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { useSelector } from 'react-redux'; import { useLocation } from 'react-router-dom-v5-compat'; -import { Grid, GridItem } from '@patternfly/react-core'; +import { Grid, GridItem, Switch } from '@patternfly/react-core'; import isUndefined from 'lodash-es/isUndefined.js'; import { Formik, FormikHelpers } from 'formik'; import { @@ -41,7 +41,6 @@ type ClusterDetailsFormProps = { ocpVersions: OpenshiftVersionOptionType[]; usedClusterNames: string[]; navigation: React.ReactNode; - moveNext: () => void; handleClusterCreate: (params: ClusterCreateParams, addCustomManifests: boolean) => Promise; handleClusterUpdate: ( clusterId: Cluster['id'], @@ -58,17 +57,18 @@ const ClusterDetailsForm = (props: ClusterDetailsFormProps) => { managedDomains, ocpVersions, usedClusterNames = [], - moveNext, handleClusterUpdate, handleClusterCreate, navigation, } = props; - const clusterWizardContext = useClusterWizardContext(); + const { installDisconnected, setInstallDisconnected, customManifestsStep, moveNext } = + useClusterWizardContext(); const { search } = useLocation(); const { isViewerMode } = useSelector(selectCurrentClusterPermissionsState); const { clearAlerts } = useAlerts(); const isSingleClusterFeatureEnabled = useFeature('ASSISTED_INSTALLER_SINGLE_CLUSTER_FEATURE'); + const isABIEnabled = useFeature('ASSISTED_INSTALLER_ABI'); const handleSubmit = React.useCallback( async (values: OcmClusterDetailsValues) => { @@ -119,17 +119,9 @@ const ClusterDetailsForm = (props: ClusterDetailsFormProps) => { managedDomains, ocpVersions, urlSearchParams: search, - addCustomManifests: clusterWizardContext.customManifestsStep, + addCustomManifests: customManifestsStep, }), - [ - infraEnv, - cluster, - pullSecret, - managedDomains, - ocpVersions, - search, - clusterWizardContext.customManifestsStep, - ], + [infraEnv, cluster, pullSecret, managedDomains, ocpVersions, search, customManifestsStep], ); const { t } = useTranslation(); @@ -173,6 +165,17 @@ const ClusterDetailsForm = (props: ClusterDetailsFormProps) => { Cluster details + {!isSingleClusterFeatureEnabled && isABIEnabled && ( + + setInstallDisconnected(checked)} + ouiaId="DisconnectedInstall" + /> + + )} void; + moveNext: () => void; wizardStepIds: ClusterWizardStepsType[]; onUpdateStaticIpView(view: StaticIpView): void; onUpdateHostNetworkConfigType(type: HostsNetworkConfigurationType): void; @@ -18,6 +18,8 @@ export type ClusterWizardContextType = { setWizardPerPage: (perPage: number) => void; updateUISettings: (data: UISettingsValues) => Promise; uiSettings?: UISettingsValues; + installDisconnected: boolean; + setInstallDisconnected: (enabled: boolean) => void; }; export const ClusterWizardContext = React.createContext(null); diff --git a/libs/ui-lib/lib/ocm/components/clusterWizard/ClusterWizardContextProvider.tsx b/libs/ui-lib/lib/ocm/components/clusterWizard/ClusterWizardContextProvider.tsx index 67ca2c5e0c..216e1860a9 100644 --- a/libs/ui-lib/lib/ocm/components/clusterWizard/ClusterWizardContextProvider.tsx +++ b/libs/ui-lib/lib/ocm/components/clusterWizard/ClusterWizardContextProvider.tsx @@ -4,6 +4,7 @@ import { ClusterWizardContextType, ClusterWizardContext } from './ClusterWizardC import { ClusterWizardFlowStateType, ClusterWizardStepsType, + disconnectedSteps, getClusterWizardFirstStep, isStaticIpStep, isStepAfter, @@ -87,9 +88,10 @@ const ClusterWizardContextProvider = ({ }>) => { const isSingleClusterFeatureEnabled = useFeature('ASSISTED_INSTALLER_SINGLE_CLUSTER_FEATURE'); const [currentStepId, setCurrentStepId] = React.useState(); - const [wizardStepIds, setWizardStepIds] = React.useState(); + const [connectedWizardStepIds, setWizardStepIds] = React.useState(); const [wizardPerPage, setWizardPerPage] = React.useState(10); const [customManifestsStep, setCustomManifestsStep] = React.useState(false); + const [installDisconnected, setInstallDisconnected] = React.useState(false); const location = useLocation(); const locationState = location.state as ClusterWizardFlowStateType | undefined; const { @@ -101,6 +103,8 @@ const ClusterWizardContextProvider = ({ const { clearAlerts, addAlert, alerts } = useAlerts(); const setClusterPermissions = useSetClusterPermissions(); + const wizardStepIds = installDisconnected ? disconnectedSteps : connectedWizardStepIds; + React.useEffect(() => { if (!UISettingsLoading) { const staticIpInfo = infraEnv ? getStaticIpInfo(infraEnv) : undefined; @@ -237,7 +241,7 @@ const ClusterWizardContextProvider = ({ ); } }, - wizardStepIds, + wizardStepIds: wizardStepIds, currentStepId, setCurrentStepId: onSetCurrentStepId, customManifestsStep, @@ -246,6 +250,15 @@ const ClusterWizardContextProvider = ({ setWizardPerPage, uiSettings, updateUISettings, + installDisconnected, + setInstallDisconnected: (enabled: boolean) => { + setInstallDisconnected(enabled); + if (enabled) { + onSetCurrentStepId(disconnectedSteps[0]); + } else { + connectedWizardStepIds?.length && onSetCurrentStepId(connectedWizardStepIds[0]); + } + }, }; }, [ wizardStepIds, @@ -257,6 +270,9 @@ const ClusterWizardContextProvider = ({ clearAlerts, uiSettings, updateUISettings, + installDisconnected, + setInstallDisconnected, + connectedWizardStepIds, ]); if (!contextValue) { diff --git a/libs/ui-lib/lib/ocm/components/clusterWizard/NewClusterWizard.tsx b/libs/ui-lib/lib/ocm/components/clusterWizard/NewClusterWizard.tsx index 827b7f6543..7563648747 100644 --- a/libs/ui-lib/lib/ocm/components/clusterWizard/NewClusterWizard.tsx +++ b/libs/ui-lib/lib/ocm/components/clusterWizard/NewClusterWizard.tsx @@ -1,11 +1,27 @@ import classNames from 'classnames'; import React from 'react'; import ClusterDetails from './ClusterDetails'; +import { useClusterWizardContext } from './ClusterWizardContext'; +import ReviewStep from './disconnected/ReviewStep'; +import BasicStep from './disconnected/BasicStep'; +import { ClusterWizardStepsType } from './wizardTransition'; + +const getCurrentStep = (currentStepId: ClusterWizardStepsType) => { + switch (currentStepId) { + case 'disconnected-review': + return ; + case 'disconnected-basic': + return ; + default: + return ; + } +}; const NewClusterWizard: React.FC = () => { + const { currentStepId } = useClusterWizardContext(); return (
- + {getCurrentStep(currentStepId)}
); }; diff --git a/libs/ui-lib/lib/ocm/components/clusterWizard/constants.ts b/libs/ui-lib/lib/ocm/components/clusterWizard/constants.ts index abe9984c4e..0977dd0e0c 100644 --- a/libs/ui-lib/lib/ocm/components/clusterWizard/constants.ts +++ b/libs/ui-lib/lib/ocm/components/clusterWizard/constants.ts @@ -12,6 +12,8 @@ export const wizardStepNames: { [key in ClusterWizardStepsType]: string } = { 'custom-manifests': 'Custom manifests', review: 'Review and create', 'credentials-download': 'Download credentials', + 'disconnected-review': 'Review and download ISO', + 'disconnected-basic': 'Basic information', }; export const defaultWizardSteps: ClusterWizardStepsType[] = [ diff --git a/libs/ui-lib/lib/ocm/components/clusterWizard/disconnected/BasicStep.tsx b/libs/ui-lib/lib/ocm/components/clusterWizard/disconnected/BasicStep.tsx new file mode 100644 index 0000000000..8eb756762f --- /dev/null +++ b/libs/ui-lib/lib/ocm/components/clusterWizard/disconnected/BasicStep.tsx @@ -0,0 +1,88 @@ +import * as React from 'react'; +import { + ClusterWizardStep, + DeveloperPreview, + ExternalLink, + OCP_RELEASES_PAGE, + StaticTextField, + useTranslation, +} from '../../../../common'; +import { + Switch, + Split, + SplitItem, + TextContent, + Text, + TextVariants, + Grid, + GridItem, + Form, +} from '@patternfly/react-core'; +import { Formik } from 'formik'; +import OcmOpenShiftVersion from '../../clusterConfiguration/OcmOpenShiftVersion'; +import { useClusterWizardContext } from '../ClusterWizardContext'; +import ClusterWizardFooter from '../ClusterWizardFooter'; +import ClusterWizardNavigation from '../ClusterWizardNavigation'; +import { WithErrorBoundary } from '../../../../common/components/ErrorHandling/WithErrorBoundary'; + +const BasicStep = () => { + const { t } = useTranslation(); + const { installDisconnected, setInstallDisconnected, moveNext, moveBack } = + useClusterWizardContext(); + + return ( + { + // nothing to do + }} + > + } + footer={} + > + + + + + + + Basic information + + + + + + + + + setInstallDisconnected(checked)} + ouiaId="DisconnectedInstall" + /> + + +
+ + + + {t('ai:Learn more about OpenShift releases')} + + + + + x86_64 + +
+
+
+
+
+
+ ); +}; + +export default BasicStep; diff --git a/libs/ui-lib/lib/ocm/components/clusterWizard/disconnected/ReviewStep.tsx b/libs/ui-lib/lib/ocm/components/clusterWizard/disconnected/ReviewStep.tsx new file mode 100644 index 0000000000..c5b7abfcf9 --- /dev/null +++ b/libs/ui-lib/lib/ocm/components/clusterWizard/disconnected/ReviewStep.tsx @@ -0,0 +1,123 @@ +import * as React from 'react'; +import ClusterWizardFooter from '../ClusterWizardFooter'; +import { useClusterWizardContext } from '../ClusterWizardContext'; +import { + ClusterWizardStep, + DeveloperPreview, + PULL_SECRET_INFO_LINK, + singleClusterOperators, +} from '../../../../common'; +import ClusterWizardNavigation from '../ClusterWizardNavigation'; +import { WithErrorBoundary } from '../../../../common/components/ErrorHandling/WithErrorBoundary'; +import { + Split, + SplitItem, + Alert, + Grid, + Text, + TextContent, + TextVariants, + DescriptionList, + DescriptionListGroup, + DescriptionListTerm, + DescriptionListDescription, + List, + ListItem, + ListComponent, + OrderType, +} from '@patternfly/react-core'; +import { Formik } from 'formik'; +import { saveAs } from 'file-saver'; +import { useNavigate } from 'react-router-dom-v5-compat'; + +import { getOperatorSpecs } from '../../../../common/components/operators/operatorSpecs'; + +const downloadUrl = + 'https://mirror.openshift.com/pub/cgw/assisted-installer-disconnected/latest/agent-ove.x86_64.iso'; + +const ReviewStep = () => { + const { moveBack } = useClusterWizardContext(); + const opSpecs = getOperatorSpecs(() => undefined); + const navigate = useNavigate(); + + return ( + { + // nothing to do + }} + > + } + footer={ + { + downloadUrl && saveAs(downloadUrl); + navigate('/cluster-list'); + }} + onBack={moveBack} + nextButtonText="Download ISO" + /> + } + > + + + + + + Review and download ISO + + + + + + + + + Download ISO + + Download or copy your pull secret from{' '} + + here + + + + Boot your cluster's machines from this ISO and follow instructions + + + Provide your pull secret inside the installation wizard when requested + + + + + + {singleClusterOperators.map((o) => { + const operator = Object.values(opSpecs) + .flatMap((op) => op) + .find((op) => op.operatorKey === o); + return {operator ? operator.title : o}; + })} + + + + + OpenShift version + 4.19 + + + CPU architecture + x86_64 + + + ISO size + approx. 35GB + + + + + + + ); +}; + +export default ReviewStep; diff --git a/libs/ui-lib/lib/ocm/components/clusterWizard/wizardTransition.ts b/libs/ui-lib/lib/ocm/components/clusterWizard/wizardTransition.ts index f2bdd96978..975858bc91 100644 --- a/libs/ui-lib/lib/ocm/components/clusterWizard/wizardTransition.ts +++ b/libs/ui-lib/lib/ocm/components/clusterWizard/wizardTransition.ts @@ -29,7 +29,9 @@ export type ClusterWizardStepsType = | 'networking' | 'review' | 'custom-manifests' - | 'credentials-download'; + | 'credentials-download' + | 'disconnected-basic' + | 'disconnected-review'; const wizardStepsOrder: ClusterWizardStepsType[] = [ 'cluster-details', @@ -45,6 +47,11 @@ const wizardStepsOrder: ClusterWizardStepsType[] = [ 'review', ]; +export const disconnectedSteps: ClusterWizardStepsType[] = [ + 'disconnected-basic', + 'disconnected-review', +]; + export const ClusterWizardFlowStateNew = 'new'; export type ClusterWizardFlowStateType = Cluster['status'] | typeof ClusterWizardFlowStateNew; @@ -251,6 +258,8 @@ const reviewStepValidationsMap: WizardStepValidationMap = { const credentialsValidationMap = buildEmptyValidationsMap(); const customManifestsValidationsMap = buildEmptyValidationsMap(); +const disconnectedReviewValidationsMap = buildEmptyValidationsMap(); +const disconnectedBasicValidationsMap = buildEmptyValidationsMap(); export const wizardStepsValidationsMap: WizardStepsValidationMap = { 'cluster-details': clusterDetailsStepValidationsMap, @@ -264,6 +273,8 @@ export const wizardStepsValidationsMap: WizardStepsValidationMap Date: Thu, 14 Aug 2025 12:01:38 +0200 Subject: [PATCH 4/8] Remove ABI check (#3118) --- libs/ui-lib/lib/common/features/featureGate.tsx | 4 +--- .../lib/ocm/components/clusterWizard/ClusterDetailsForm.tsx | 3 +-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/libs/ui-lib/lib/common/features/featureGate.tsx b/libs/ui-lib/lib/common/features/featureGate.tsx index fa356fee89..c9775fff3c 100644 --- a/libs/ui-lib/lib/common/features/featureGate.tsx +++ b/libs/ui-lib/lib/common/features/featureGate.tsx @@ -1,9 +1,7 @@ import React from 'react'; // Must conform Unleash constants -export type AssistedInstallerFeatureType = - | 'ASSISTED_INSTALLER_SINGLE_CLUSTER_FEATURE' - | 'ASSISTED_INSTALLER_ABI'; +export type AssistedInstallerFeatureType = 'ASSISTED_INSTALLER_SINGLE_CLUSTER_FEATURE'; export type FeatureListType = { [key in AssistedInstallerFeatureType]?: boolean; diff --git a/libs/ui-lib/lib/ocm/components/clusterWizard/ClusterDetailsForm.tsx b/libs/ui-lib/lib/ocm/components/clusterWizard/ClusterDetailsForm.tsx index 8595284143..dda0c20307 100644 --- a/libs/ui-lib/lib/ocm/components/clusterWizard/ClusterDetailsForm.tsx +++ b/libs/ui-lib/lib/ocm/components/clusterWizard/ClusterDetailsForm.tsx @@ -68,7 +68,6 @@ const ClusterDetailsForm = (props: ClusterDetailsFormProps) => { const { isViewerMode } = useSelector(selectCurrentClusterPermissionsState); const { clearAlerts } = useAlerts(); const isSingleClusterFeatureEnabled = useFeature('ASSISTED_INSTALLER_SINGLE_CLUSTER_FEATURE'); - const isABIEnabled = useFeature('ASSISTED_INSTALLER_ABI'); const handleSubmit = React.useCallback( async (values: OcmClusterDetailsValues) => { @@ -165,7 +164,7 @@ const ClusterDetailsForm = (props: ClusterDetailsFormProps) => { Cluster details - {!isSingleClusterFeatureEnabled && isABIEnabled && ( + {!isSingleClusterFeatureEnabled && ( Date: Thu, 14 Aug 2025 14:21:49 +0200 Subject: [PATCH 5/8] Remove back button from first page (#3120) --- .../ocm/components/clusterWizard/disconnected/BasicStep.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libs/ui-lib/lib/ocm/components/clusterWizard/disconnected/BasicStep.tsx b/libs/ui-lib/lib/ocm/components/clusterWizard/disconnected/BasicStep.tsx index 8eb756762f..badf827381 100644 --- a/libs/ui-lib/lib/ocm/components/clusterWizard/disconnected/BasicStep.tsx +++ b/libs/ui-lib/lib/ocm/components/clusterWizard/disconnected/BasicStep.tsx @@ -27,8 +27,7 @@ import { WithErrorBoundary } from '../../../../common/components/ErrorHandling/W const BasicStep = () => { const { t } = useTranslation(); - const { installDisconnected, setInstallDisconnected, moveNext, moveBack } = - useClusterWizardContext(); + const { installDisconnected, setInstallDisconnected, moveNext } = useClusterWizardContext(); return ( { > } - footer={} + footer={} > From 807ea897893494ef10a9af66114d40cd92430ca2 Mon Sep 17 00:00:00 2001 From: Ashraf Masarwa Date: Tue, 19 Aug 2025 13:50:17 +0300 Subject: [PATCH 6/8] Revert "Run Prettier on changes" This reverts commit dbe03bda3edbe68ad25ea5648adf5ed4612a5d54. --- .../FormViewNetworkWide/FormViewNetworkWideFields.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/ui-lib/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.tsx b/libs/ui-lib/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.tsx index c47f136e0b..9a34e99c0e 100644 --- a/libs/ui-lib/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.tsx +++ b/libs/ui-lib/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.tsx @@ -88,7 +88,7 @@ const MachineNetwork: React.FC<{ fieldName: string; protocolVersion: ProtocolVer return `Prefix length must be at most ${MAX_PREFIX_LENGTH[protocolVersion]}`; } return undefined; - }; + } const fieldId = getFieldId(`${fieldName}`, 'input'); return ( From 768c9f9eebeb5abaed6337ab83b205013ed40935 Mon Sep 17 00:00:00 2001 From: Ashraf Masarwa Date: Tue, 19 Aug 2025 13:50:31 +0300 Subject: [PATCH 7/8] Revert "[Staging] [UI] - Machine network CIDR value should be mandatory" This reverts commit 5666501395c4526ac5b9dab7f7921c2a190037b1. --- .../FormViewNetworkWideFields.tsx | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/libs/ui-lib/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.tsx b/libs/ui-lib/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.tsx index 9a34e99c0e..b40f5af887 100644 --- a/libs/ui-lib/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.tsx +++ b/libs/ui-lib/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/FormViewNetworkWideFields.tsx @@ -76,20 +76,6 @@ const MachineNetwork: React.FC<{ fieldName: string; protocolVersion: ProtocolVer const cidr = getMachineNetworkCidr(value); return getHumanizedSubnetRange(getAddressObject(cidr, protocolVersion)); }, [value, protocolVersion, errorMessage]); - - const handleValidatePrefixLength = (value: string) => { - if (!value || value === '') { - return 'Prefix length is required'; - } - if (Number(value) < MIN_PREFIX_LENGTH) { - return `Prefix length must be at least ${MIN_PREFIX_LENGTH}`; - } - if (Number(value) > MAX_PREFIX_LENGTH[protocolVersion]) { - return `Prefix length must be at most ${MAX_PREFIX_LENGTH[protocolVersion]}`; - } - return undefined; - } - const fieldId = getFieldId(`${fieldName}`, 'input'); return ( From 7709896ab7b7bb900b58c99b11a92c7fc9679de9 Mon Sep 17 00:00:00 2001 From: Ashraf Masarwa Date: Tue, 19 Aug 2025 13:51:23 +0300 Subject: [PATCH 8/8] MGMT-20743 | [Staging] [UI] - Machine network CIDR value should be mandatory --- .../FormViewNetworkWide/formViewNetworkWideValidationSchema.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/libs/ui-lib/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/formViewNetworkWideValidationSchema.tsx b/libs/ui-lib/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/formViewNetworkWideValidationSchema.tsx index fc37a77c76..07d5fe3da7 100644 --- a/libs/ui-lib/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/formViewNetworkWideValidationSchema.tsx +++ b/libs/ui-lib/lib/ocm/components/clusterConfiguration/staticIp/components/FormViewNetworkWide/formViewNetworkWideValidationSchema.tsx @@ -66,7 +66,6 @@ const getMachineNetworkValidationSchema = (protocolVersion: ProtocolVersion) => MAX_PREFIX_LENGTH[protocolVersion], `Prefix length must be less than or equal to ${MAX_PREFIX_LENGTH[protocolVersion]}`, ) - .nullable() .transform(transformNumber) as Yup.NumberSchema, //add casting to not get typescript error caused by nullable });