,
selection: string
) => {
setSearchTerm(selection);
};
const handleClear = async () => {
setSearchTerm('');
};
const handleSelect = (
pkg: IBPackageWithRepositoryInfo,
_: number,
isSelecting: boolean
) => {
if (isSelecting) {
if (
isSuccessEpelRepo &&
epelRepo.data &&
pkg.repository === 'recommended' &&
!recommendedRepositories.some((repo) => repo.name?.startsWith('EPEL'))
) {
setIsRepoModalOpen(true);
setIsSelectingPackage(pkg);
} else {
dispatch(addPackage(pkg));
}
} else {
dispatch(removePackage(pkg.name));
if (
isSuccessEpelRepo &&
epelRepo.data &&
packages.filter((pkg) => pkg.repository === 'recommended').length ===
1 &&
groups.filter((grp) => grp.repository === 'recommended').length === 0
) {
dispatch(removeRecommendedRepository(epelRepo.data[0]));
}
}
};
const handleGroupSelect = (
grp: GroupWithRepositoryInfo,
_: number,
isSelecting: boolean
) => {
if (isSelecting) {
if (
isSuccessEpelRepo &&
epelRepo.data &&
grp.repository === 'recommended' &&
!recommendedRepositories.some((repo) => repo.name?.startsWith('EPEL'))
) {
setIsRepoModalOpen(true);
setIsSelectingGroup(grp);
} else {
dispatch(addGroup(grp));
}
} else {
dispatch(removeGroup(grp.name));
if (
isSuccessEpelRepo &&
epelRepo.data &&
groups.filter((grp) => grp.repository === 'recommended').length === 1 &&
packages.filter((pkg) => pkg.repository === 'recommended').length === 0
) {
dispatch(removeRecommendedRepository(epelRepo.data[0]));
}
}
};
const handleFilterToggleClick = (event: React.MouseEvent) => {
const id = event.currentTarget.id;
setPage(1);
setToggleSelected(id);
};
const handleRepoToggleClick = (type: RepoToggle) => {
if (toggleSourceRepos !== type) {
setPage(1);
setToggleSourceRepos(type);
}
};
const handleSetPage = (_: React.MouseEvent, newPage: number) => {
setPage(newPage);
};
const handlePerPageSelect = (
_: React.MouseEvent,
newPerPage: number,
newPage: number
) => {
setPerPage(newPerPage);
setPage(newPage);
};
const computeStart = () => perPage * (page - 1);
const computeEnd = () => perPage * page;
const handleExactMatch = () => {
const exactMatch = transformedPackages.find(
(pkg) => pkg.name === debouncedSearchTerm
);
if (exactMatch) {
return (
<>
p.name === exactMatch.name),
rowIndex: 0,
onSelect: (event, isSelecting) =>
handleSelect(exactMatch, 0, isSelecting),
}}
/>
{exactMatch.name}
{exactMatch.summary}
{exactMatch.repository === 'distro' ? (
<>
Supported
>
) : (
<>
Third party repository
Not supported
>
)}
>
);
} else {
return ;
}
};
const handleCloseModalToggle = () => {
setIsRepoModalOpen(!isRepoModalOpen);
setIsSelectingPackage(undefined);
};
const handleConfirmModalToggle = async () => {
if (!epelRepo || !epelRepo.data) {
throw new Error(
`There was an error while adding the recommended repository.`
);
}
if (epelRepo.data.length === 0) {
const result = await createRepository({
apiRepositoryRequest: distribution.startsWith('rhel-8')
? EPEL_8_REPO_DEFINITION
: EPEL_9_REPO_DEFINITION,
});
dispatch(
addRecommendedRepository(
(result as { data: ApiRepositoryResponseRead }).data
)
);
} else {
dispatch(addRecommendedRepository(epelRepo.data[0]));
}
if (isSelectingPackage) {
dispatch(addPackage(isSelectingPackage!));
}
if (isSelectingGroup) {
dispatch(addGroup(isSelectingGroup!));
}
setIsRepoModalOpen(!isRepoModalOpen);
};
const composePkgTable = () => {
let rows: ReactElement[] = [];
if (showGroups) {
rows = rows.concat(
transformedGroups
.slice(computeStart(), computeEnd())
.map((grp, rowIndex) => (
g.name === grp.name),
rowIndex: rowIndex,
onSelect: (event, isSelecting) =>
handleGroupSelect(grp, rowIndex, isSelecting),
}}
/>
@{grp.name}
0
? { height: '40em', overflow: 'scroll' }
: {}
}
>
{grp.package_list.length > 0 ? (
{grp.package_list.map((pkg) => (
{pkg}
))}
) : (
This group has no packages
)}
}
>
{grp.description ? (
grp.description
) : (
Not available
)}
{grp.repository === 'distro' ? (
<>
{' '}
Red Hat repository
Supported
>
) : grp.repository === 'custom' ? (
<>
Third party repository
Not supported
>
) : grp.repository === 'recommended' ? (
<>
{' '}
EPEL {distribution.startsWith('rhel-8') ? '8' : '9'}{' '}
Everything x86_64
Not supported
>
) : (
<>
Not available
Not available
>
)}
))
);
}
if (showPackages) {
rows = rows.concat(
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 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 rows;
};
const bodyContent = useMemo(() => {
switch (true) {
case debouncedSearchTermLengthOf1 &&
!debouncedSearchTermIsGroup &&
transformedPackages.length === 0 &&
transformedGroups.length === 0:
return TooShort();
case (toggleSelected === 'toggle-selected' &&
packages.length === 0 &&
groups.length === 0) ||
(!debouncedSearchTerm && toggleSelected === 'toggle-available'):
return ;
case (debouncedSearchTerm &&
(isLoadingRecommendedPackages || isLoadingRecommendedGroups) &&
toggleSourceRepos === RepoToggle.OTHER) ||
(debouncedSearchTerm &&
(isLoadingDistroPackages ||
isLoadingCustomPackages ||
isLoadingDistroGroups ||
isLoadingCustomGroups) &&
toggleSourceRepos === RepoToggle.INCLUDED):
return ;
case debouncedSearchTerm &&
transformedPackages.length === 0 &&
transformedGroups.length === 0 &&
toggleSelected === 'toggle-available':
return ;
case debouncedSearchTerm &&
toggleSelected === 'toggle-selected' &&
toggleSourceRepos === RepoToggle.OTHER &&
packages.length > 0 &&
groups.length > 0:
return ;
case debouncedSearchTerm && transformedPackages.length >= 100:
return handleExactMatch();
case (debouncedSearchTerm || toggleSelected === 'toggle-selected') &&
transformedPackages.length < 100 &&
transformedGroups.length < 100:
return composePkgTable();
default:
return <>>;
}
// Would need significant rewrite to fix this
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [
page,
perPage,
debouncedSearchTerm,
debouncedSearchTermLengthOf1,
debouncedSearchTermIsGroup,
isLoadingCustomPackages,
isLoadingDistroPackages,
isLoadingRecommendedPackages,
isSuccessRecommendedPackages,
isLoadingDistroGroups,
isLoadingCustomGroups,
isLoadingRecommendedGroups,
packages.length,
groups.length,
toggleSelected,
toggleSourceRepos,
transformedPackages,
isSelectingPackage,
recommendedRepositories,
transformedPackages.length,
transformedGroups.length,
]);
return (
<>
{searchTerm && (
}
ouiaId="clear-package-search-button"
/>
)}
Included repos{' '}
View packages from the Red Hat repository and
repositories you've selected.
}
>
>
}
buttonId={RepoToggle.INCLUDED}
isSelected={toggleSourceRepos === RepoToggle.INCLUDED}
onChange={() => handleRepoToggleClick(RepoToggle.INCLUDED)}
/>
Other repos{' '}
View packages from popular repositories and your
other repositories not included in the image.
}
>
>
}
buttonId="toggle-other-repos"
isSelected={toggleSourceRepos === RepoToggle.OTHER}
onChange={() => handleRepoToggleClick(RepoToggle.OTHER)}
/>
Package name
Description
{toggleSelected === 'toggle-selected' && (
)}
Package repository
Support
{bodyContent}
>
);
};
export default Packages;