diff --git a/src/Components/CreateImageWizardV2/steps/Packages/Packages.tsx b/src/Components/CreateImageWizardV2/steps/Packages/Packages.tsx index 8b15a472..be6b043a 100644 --- a/src/Components/CreateImageWizardV2/steps/Packages/Packages.tsx +++ b/src/Components/CreateImageWizardV2/steps/Packages/Packages.tsx @@ -28,8 +28,13 @@ import { HelpIcon, OptimizeIcon, SearchIcon } from '@patternfly/react-icons'; import { Table, Tbody, Td, Th, Thead, Tr } from '@patternfly/react-table'; import { useDispatch } from 'react-redux'; -import { RH_ICON_SIZE } from '../../../../constants'; import { + EPEL_8_REPO_DEFINITION, + EPEL_9_REPO_DEFINITION, + RH_ICON_SIZE, +} from '../../../../constants'; +import { + useCreateRepositoryMutation, useListRepositoriesQuery, useSearchRpmMutation, } from '../../../../store/contentSourcesApi'; @@ -95,7 +100,7 @@ const Packages = () => { { data: dataCustomPackages, isSuccess: isSuccessCustomPackages, - isLoading: isLoadingRpms, + isLoading: isLoadingCustomPackages, }, ] = useSearchRpmMutation(); const [ @@ -107,15 +112,20 @@ const Packages = () => { }, ] = useSearchRpmMutation(); - const { data: dataDistroPackages, isSuccess: isSuccessDistroPackages } = - useGetPackagesQuery( - { - distribution: distribution, - architecture: arch, - search: searchTerm, - }, - { skip: !searchTerm } - ); + const { + data: dataDistroPackages, + isSuccess: isSuccessDistroPackages, + isLoading: isLoadingDistroPackages, + } = useGetPackagesQuery( + { + distribution: distribution, + architecture: arch, + search: searchTerm, + }, + { skip: !searchTerm } + ); + + const [createRepository] = useCreateRepositoryMutation(); useEffect(() => { const fetchCustomPackages = async () => { @@ -161,11 +171,19 @@ const Packages = () => { } /> - - Search above to add additional -
- packages to your image. -
+ {toggleSelected === 'toggle-available' ? ( + + Search above to add additional +
+ packages to your image. +
+ ) : ( + + No packages selected. +
+ Search above to see available packages. +
+ )}
@@ -383,10 +401,26 @@ const Packages = () => { } if (toggleSelected === 'toggle-available') { - return combinedPackageData; + if (toggleSourceRepos === 'toggle-included-repos') { + return combinedPackageData.filter( + (pkg) => pkg.repository !== 'recommended' + ); + } else { + return combinedPackageData.filter( + (pkg) => pkg.repository === 'recommended' + ); + } } else { const selectedPackages = [...packages]; - return selectedPackages; + if (toggleSourceRepos === 'toggle-included-repos') { + return selectedPackages.filter( + (pkg) => pkg.repository !== 'recommended' + ); + } else { + return selectedPackages.filter( + (pkg) => pkg.repository === 'recommended' + ); + } } }; @@ -541,10 +575,82 @@ const Packages = () => { `There was an error while adding the recommended repository.` ); } + const enableEpelRepository = async () => { + await createRepository({ + apiRepositoryRequest: distribution.startsWith('rhel-8') + ? EPEL_8_REPO_DEFINITION + : EPEL_9_REPO_DEFINITION, + }); + }; + + if (epelRepo.data.length === 0) { + enableEpelRepository(); + } + dispatch(addRecommendedRepository(epelRepo.data[0])); setIsRepoModalOpen(!isRepoModalOpen); }; + const composePkgTable = () => { + return transformedPackages + .slice(computeStart(), computeEnd()) + .map((pkg, rowIndex) => ( + + p.name === pkg.name), + rowIndex: rowIndex, + onSelect: (event, isSelecting) => + handleSelect(pkg, rowIndex, isSelecting), + }} + /> + {pkg.name} + + {pkg.summary ? ( + pkg.summary + ) : ( + Not available + )} + + {pkg.repository === 'distro' ? ( + <> + + Red Hat logo{' '} + Red Hat repository + + Supported + + ) : pkg.repository === 'custom' ? ( + <> + Third party repository + Not supported + + ) : pkg.repository === 'recommended' ? ( + <> + + + + {' '} + EPEL {distribution.startsWith('rhel-8') ? '8' : '9'} Everything + x86_64 + + Not supported + + ) : ( + <> + Not available + Not available + + )} + + )); + }; + return ( <> @@ -698,79 +804,24 @@ const Packages = () => { - {!searchTerm && toggleSelected === 'toggle-available' && ( + {((toggleSelected === 'toggle-selected' && packages.length === 0) || + (!searchTerm && toggleSelected === 'toggle-available')) && ( )} - {searchTerm && (isLoadingRecommendedPackages || isLoadingRpms) && ( - - )} + {((searchTerm && + isLoadingRecommendedPackages && + toggleSourceRepos === 'toggle-other-repos') || + (searchTerm && + (isLoadingDistroPackages || isLoadingCustomPackages) && + toggleSourceRepos === 'toggle-included-repos')) && } {searchTerm && - !isLoadingRecommendedPackages && + isSuccessRecommendedPackages && transformedPackages.length === 0 && toggleSelected === 'toggle-available' && } {searchTerm && transformedPackages.length >= 100 && handleExactMatch()} - {transformedPackages.length < 100 && - transformedPackages - .slice(computeStart(), computeEnd()) - .map((pkg, rowIndex) => ( - - p.name === pkg.name), - rowIndex: rowIndex, - onSelect: (event, isSelecting) => - handleSelect(pkg, rowIndex, isSelecting), - }} - /> - {pkg.name} - - {pkg.summary ? ( - pkg.summary - ) : ( - Not available - )} - - {pkg.repository === 'distro' ? ( - <> - - Red Hat logo{' '} - Red Hat repository - - Supported - - ) : pkg.repository === 'custom' ? ( - <> - Third party repository - Not supported - - ) : pkg.repository === 'recommended' ? ( - <> - - - - {' '} - EPEL {distribution.startsWith('rhel-8') ? '8' : '9'}{' '} - Everything x86_64 - - Not supported - - ) : ( - <> - Not available - Not available - - )} - - ))} + {transformedPackages.length < 100 && composePkgTable()}