CreateImageWizard: filter already added packages

When a user searches for available packages, already chosen packages are
filtered from the available packages list. This prevents the user from
adding duplicate packages.
This commit is contained in:
Jacob Kozol 2021-11-30 12:36:19 +01:00 committed by Sanne Raymaekers
parent db6aa5158d
commit 4d987eb05e
2 changed files with 38 additions and 1 deletions

View file

@ -80,6 +80,14 @@ const Packages = ({ defaultArch, ...props }) => {
setPackagesAvailable(sortResults);
});
// filter the packages by name
const filterPackagesAvailable = useCallback((packageList) => {
return packageList.filter((availablePackage) => {
// returns true if no packages in the available or chosen list have the same name
return !packagesChosen.some((chosenPackage) => availablePackage.name === chosenPackage.name);
});
});
// call api to list available packages
const handlePackagesAvailableSearch = async () => {
const { data } = await api.getPackages(
@ -88,8 +96,9 @@ const Packages = ({ defaultArch, ...props }) => {
packagesSearchName.current
);
if (data) {
const packagesAvailableFiltered = filterPackagesAvailable(data);
sortPackages(packagesAvailableFiltered);
setPackagesAvailableFound(true);
sortPackages(data);
} else {
setPackagesAvailableFound(false);
}

View file

@ -611,6 +611,34 @@ describe('Step Packages', () => {
// We need to clear this input in order to not have sideeffects on other tests
await searchForChosenPackages(searchboxChosen, '');
});
test('should filter chosen packages from available list', async () => {
const searchboxAvailable = screen.getAllByRole('textbox')[0];
const getPackages = jest
.spyOn(api, 'getPackages')
.mockImplementation(() => Promise.resolve(mockPkgResult));
searchboxAvailable.click();
await searchForAvailablePackages(searchboxAvailable, 'test');
expect(getPackages).toHaveBeenCalledTimes(1);
const availablePackages = screen.getByTestId('available-pkgs-list');
expect(availablePackages.children.length).toEqual(3);
screen.getByRole('option', { name: /testPkg test package summary/ }).click();
screen.getByRole('button', { name: /Add selected/ }).click();
const chosenPackages = screen.getByTestId('chosen-pkgs-list');
expect(availablePackages.children.length).toEqual(2);
expect(chosenPackages.children.length).toEqual(1);
searchboxAvailable.click();
await searchForAvailablePackages(searchboxAvailable, 'test');
expect(getPackages).toHaveBeenCalledTimes(2);
expect(availablePackages.children.length).toEqual(2);
expect(chosenPackages.children.length).toEqual(1);
});
});
describe('Step Review', () => {