import React, { useState } from 'react'; import { Button, ExpandableSection, Text, TextContent, TextList, TextListItem, TextListItemVariants, TextListVariants, TextVariants, useWizardContext, } from '@patternfly/react-core'; import { ArrowRightIcon } from '@patternfly/react-icons'; import { ContentList, FSCList, FirstBootList, DetailsList, ImageOutputList, OscapList, RegisterLaterList, RegisterNowList, TargetEnvAWSList, TargetEnvAzureList, TargetEnvGCPList, TargetEnvOciList, TargetEnvOtherList, UsersList, TimezoneList, LocaleList, HostnameList, KernelList, } from './ReviewStepTextLists'; import isRhel from '../../../../../src/Utilities/isRhel'; import { targetOptions } from '../../../../constants'; import { useAppSelector } from '../../../../store/hooks'; import { selectBlueprintDescription, selectBlueprintName, selectComplianceType, selectCompliancePolicyID, selectComplianceProfileID, selectDistribution, selectImageTypes, selectRegistrationType, selectHostname, selectLanguages, selectKeyboard, selectTimezone, selectNtpServers, } from '../../../../store/wizardSlice'; import { useFlag } from '../../../../Utilities/useGetEnvironment'; const Review = ({ snapshottingEnabled }: { snapshottingEnabled: boolean }) => { const { goToStepById } = useWizardContext(); const blueprintName = useAppSelector(selectBlueprintName); const blueprintDescription = useAppSelector(selectBlueprintDescription); const distribution = useAppSelector(selectDistribution); const environments = useAppSelector(selectImageTypes); const complianceType = useAppSelector(selectComplianceType); const complianceProfile = useAppSelector(selectComplianceProfileID); const compliancePolicy = useAppSelector(selectCompliancePolicyID); const registrationType = useAppSelector(selectRegistrationType); const hostname = useAppSelector(selectHostname); const languages = useAppSelector(selectLanguages); const keyboard = useAppSelector(selectKeyboard); const timezone = useAppSelector(selectTimezone); const ntpServers = useAppSelector(selectNtpServers); const [isExpandedImageOutput, setIsExpandedImageOutput] = useState(true); const [isExpandedTargetEnvs, setIsExpandedTargetEnvs] = useState(true); const [isExpandedFSC, setIsExpandedFSC] = useState(true); const [isExpandedContent, setIsExpandedContent] = useState(true); const [isExpandedRegistration, setIsExpandedRegistration] = useState(true); const [isExpandedImageDetail, setIsExpandedImageDetail] = useState(true); const [isExpandedOscapDetail, setIsExpandedOscapDetail] = useState(true); const [isExpandedComplianceDetail, setIsExpandedComplianceDetail] = useState(true); const [isExpandedTimezone, setIsExpandedTimezone] = useState(true); const [isExpandedLocale, setIsExpandedLocale] = useState(true); const [isExpandedHostname, setIsExpandedHostname] = useState(true); const [isExpandedKernel, setIsExpandedKernel] = useState(true); const [isExpandableFirstBoot, setIsExpandedFirstBoot] = useState(true); const [isExpandedUsers, setIsExpandedUsers] = useState(true); const isTimezoneEnabled = useFlag('image-builder.timezone.enabled'); const isLocaleEnabled = useFlag('image-builder.locale.enabled'); const isHostnameEnabled = useFlag('image-builder.hostname.enabled'); const isKernelEnabled = useFlag('image-builder.kernel.enabled'); const onToggleImageOutput = (isExpandedImageOutput: boolean) => setIsExpandedImageOutput(isExpandedImageOutput); const onToggleTargetEnvs = (isExpandedTargetEnvs: boolean) => setIsExpandedTargetEnvs(isExpandedTargetEnvs); const onToggleFSC = (isExpandedFSC: boolean) => setIsExpandedFSC(isExpandedFSC); const onToggleContent = (isExpandedContent: boolean) => setIsExpandedContent(isExpandedContent); const onToggleRegistration = (isExpandedRegistration: boolean) => setIsExpandedRegistration(isExpandedRegistration); const onToggleImageDetail = (isExpandedImageDetail: boolean) => setIsExpandedImageDetail(isExpandedImageDetail); const onToggleOscapDetails = (isExpandedOscapDetail: boolean) => setIsExpandedOscapDetail(isExpandedOscapDetail); const onToggleComplianceDetails = (isExpandedComplianceDetail: boolean) => setIsExpandedComplianceDetail(isExpandedComplianceDetail); const onToggleTimezone = (isExpandedTimezone: boolean) => setIsExpandedTimezone(isExpandedTimezone); const onToggleLocale = (isExpandedLocale: boolean) => setIsExpandedLocale(isExpandedLocale); const onToggleHostname = (isExpandedHostname: boolean) => setIsExpandedHostname(isExpandedHostname); const onToggleKernel = (isExpandedKernel: boolean) => setIsExpandedKernel(isExpandedKernel); const onToggleFirstBoot = (isExpandableFirstBoot: boolean) => setIsExpandedFirstBoot(isExpandableFirstBoot); const onToggleUsers = (isExpandedUsers: boolean) => setIsExpandedUsers(isExpandedUsers); type RevisitStepButtonProps = { ariaLabel: string; testId: string; stepId: string; }; const RevisitStepButton = ({ ariaLabel, testId, stepId, }: RevisitStepButtonProps) => { return ( ); }; const revisitStep = (stepId: string) => { goToStepById(stepId); }; const composeExpandable = (label: string, testId: string, stepId: string) => { return ( ); }; const isFirstBootEnabled = useFlag('image-builder.firstboot.enabled'); const isUsersEnabled = useFlag('image-builder.users.enabled'); return ( <> onToggleImageOutput(isExpandedImageOutput) } isExpanded={isExpandedImageOutput} isIndented data-testid="image-output-expandable" > onToggleTargetEnvs(isExpandedTargetEnvs) } isExpanded={isExpandedTargetEnvs} isIndented data-testid="target-environments-expandable" > {environments.includes('aws') && } {environments.includes('gcp') && } {environments.includes('azure') && } {environments.includes('oci') && } {environments.includes('vsphere') && ( {targetOptions.vsphere} (.vmdk) )} {environments.includes('vsphere-ova') && ( {targetOptions['vsphere-ova']} (.ova) )} {environments.includes('guest-image') && ( {targetOptions['guest-image']} (.qcow2) )} {environments.includes('image-installer') && ( {targetOptions['image-installer']} (.iso) )} {environments.includes('wsl') && ( WSL - {targetOptions.wsl} (.tar.gz) )} {isRhel(distribution) && ( onToggleRegistration(isExpandedRegistration) } isExpanded={isExpandedRegistration} isIndented data-testid="registration-expandable" > {registrationType === 'register-later' && } {registrationType.startsWith('register-now') && } )} {complianceProfile && complianceType === 'openscap' && ( onToggleOscapDetails(isExpandedOscapDetail) } isExpanded={isExpandedOscapDetail} isIndented data-testid="oscap-detail-expandable" > )} {compliancePolicy && complianceType === 'compliance' && ( onToggleComplianceDetails(isExpandedComplianceDetail) } isExpanded={isExpandedComplianceDetail} isIndented data-testid="compliance-detail-expandable" > )} onToggleFSC(isExpandedFSC)} isExpanded={isExpandedFSC} isIndented data-testid="file-system-configuration-expandable" > onToggleContent(isExpandedContent) } isExpanded={isExpandedContent} isIndented data-testid="content-expandable" > {/* Intentional prop drilling for simplicity - To be removed */} {isUsersEnabled && ( onToggleUsers(isExpandedUsers)} isExpanded={isExpandedUsers} isIndented data-testid="users-expandable" > )} {isTimezoneEnabled && (timezone || (ntpServers && ntpServers.length > 0)) && ( onToggleTimezone(isExpandedTimezone) } isExpanded={isExpandedTimezone} isIndented data-testid="timezone-expandable" > )} {isLocaleEnabled && ((languages && languages.length > 0) || (keyboard && keyboard.length > 0)) && ( onToggleLocale(isExpandedLocale) } isExpanded={isExpandedLocale} isIndented data-testid="locale-expandable" > )} {isHostnameEnabled && hostname && ( onToggleHostname(isExpandedHostname) } isExpanded={isExpandedHostname} isIndented data-testid="hostname-expandable" > )} {isKernelEnabled && ( onToggleKernel(isExpandedKernel) } isExpanded={isExpandedKernel} isIndented data-testid="kernel-expandable" > )} {isFirstBootEnabled && ( onToggleFirstBoot(isExpandableFirstBoot) } isExpanded={isExpandableFirstBoot} isIndented data-testid="firstboot-expandable" > )} {(blueprintName || blueprintDescription) && ( onToggleImageDetail(isExpandedImageDetail) } isExpanded={isExpandedImageDetail} isIndented data-testid="image-details-expandable" > )} ); }; export default Review;