diff --git a/.changeset/poor-weeks-act.md b/.changeset/poor-weeks-act.md
new file mode 100644
index 0000000000..152ce4bfc6
--- /dev/null
+++ b/.changeset/poor-weeks-act.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder': patch
+---
+
+Change the Categories filter to a dropdown component
diff --git a/plugins/scaffolder/src/components/TemplateTypePicker/TemplateTypePicker.test.tsx b/plugins/scaffolder/src/components/TemplateTypePicker/TemplateTypePicker.test.tsx
index 534b3b6ce9..3d0267ff1f 100644
--- a/plugins/scaffolder/src/components/TemplateTypePicker/TemplateTypePicker.test.tsx
+++ b/plugins/scaffolder/src/components/TemplateTypePicker/TemplateTypePicker.test.tsx
@@ -94,6 +94,7 @@ describe('', () => {
,
);
expect(rendered.getByText('Categories')).toBeInTheDocument();
+ fireEvent.click(rendered.getByTestId('categories-picker-expand'));
entities.forEach(entity => {
expect(
@@ -116,22 +117,27 @@ describe('', () => {
,
);
+ fireEvent.click(rendered.getByTestId('categories-picker-expand'));
expect(rendered.getByLabelText('Service')).not.toBeChecked();
expect(rendered.getByLabelText('Website')).not.toBeChecked();
fireEvent.click(rendered.getByLabelText('Service'));
+ fireEvent.click(rendered.getByTestId('categories-picker-expand'));
expect(rendered.getByLabelText('Service')).toBeChecked();
expect(rendered.getByLabelText('Website')).not.toBeChecked();
fireEvent.click(rendered.getByLabelText('Website'));
+ fireEvent.click(rendered.getByTestId('categories-picker-expand'));
expect(rendered.getByLabelText('Service')).toBeChecked();
expect(rendered.getByLabelText('Website')).toBeChecked();
fireEvent.click(rendered.getByLabelText('Service'));
+ fireEvent.click(rendered.getByTestId('categories-picker-expand'));
expect(rendered.getByLabelText('Service')).not.toBeChecked();
expect(rendered.getByLabelText('Website')).toBeChecked();
fireEvent.click(rendered.getByLabelText('Website'));
+ fireEvent.click(rendered.getByTestId('categories-picker-expand'));
expect(rendered.getByLabelText('Service')).not.toBeChecked();
expect(rendered.getByLabelText('Website')).not.toBeChecked();
});
diff --git a/plugins/scaffolder/src/components/TemplateTypePicker/TemplateTypePicker.tsx b/plugins/scaffolder/src/components/TemplateTypePicker/TemplateTypePicker.tsx
index 7151446f4f..a8418cfded 100644
--- a/plugins/scaffolder/src/components/TemplateTypePicker/TemplateTypePicker.tsx
+++ b/plugins/scaffolder/src/components/TemplateTypePicker/TemplateTypePicker.tsx
@@ -21,22 +21,20 @@ import {
Box,
Checkbox,
FormControlLabel,
- FormGroup,
- makeStyles,
- Theme,
+ TextField,
Typography,
} from '@material-ui/core';
+import CheckBoxIcon from '@material-ui/icons/CheckBox';
+import CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';
+import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
+import { Autocomplete } from '@material-ui/lab';
import { useEntityTypeFilter } from '@backstage/plugin-catalog-react';
import { alertApiRef, useApi } from '@backstage/core-plugin-api';
-const useStyles = makeStyles(theme => ({
- checkbox: {
- padding: theme.spacing(1, 1, 1, 2),
- },
-}));
+const icon = ;
+const checkedIcon = ;
export const TemplateTypePicker = () => {
- const classes = useStyles();
const alertApi = useApi(alertApiRef);
const { error, loading, availableTypes, selectedTypes, setSelectedTypes } =
useEntityTypeFilter();
@@ -53,32 +51,31 @@ export const TemplateTypePicker = () => {
return null;
}
- function toggleSelection(type: string) {
- setSelectedTypes(
- selectedTypes.includes(type)
- ? selectedTypes.filter(t => t !== type)
- : [...selectedTypes, type],
- );
- }
-
return (
Categories
-
- {availableTypes.map(type => (
+
+ multiple
+ aria-label="Categories"
+ options={availableTypes}
+ value={selectedTypes}
+ onChange={(_: object, value: string[]) => setSelectedTypes(value)}
+ renderOption={(option, { selected }) => (
toggleSelection(type)}
- className={classes.checkbox}
+ icon={icon}
+ checkedIcon={checkedIcon}
+ checked={selected}
/>
}
- label={capitalize(type)}
- key={type}
+ label={capitalize(option)}
/>
- ))}
-
+ )}
+ size="small"
+ popupIcon={}
+ renderInput={params => }
+ />
);
};