Destructure query params in picker

Signed-off-by: Tim Hansen <timbonicus@gmail.com>
This commit is contained in:
Tim Hansen
2022-04-01 15:46:01 -06:00
parent 268f7faeea
commit 4be0d1e777
7 changed files with 47 additions and 27 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-react': patch
---
Changed catalog filter components to only pay attention to query parameters relevant to the component.
@@ -33,10 +33,11 @@ export interface EntityKindPickerProps {
export const EntityKindPicker = (props: EntityKindPickerProps) => {
const { initialFilter, hidden } = props;
const { updateFilters, queryParameters } = useEntityList();
const [selectedKind] = useState(
[queryParameters.kind].flat()[0] ?? initialFilter,
);
const {
updateFilters,
queryParameters: { kind: kindParameter },
} = useEntityList();
const [selectedKind] = useState([kindParameter].flat()[0] ?? initialFilter);
useEffect(() => {
updateFilters({
@@ -49,12 +49,16 @@ const checkedIcon = <CheckBoxIcon fontSize="small" />;
/** @public */
export const EntityLifecyclePicker = () => {
const classes = useStyles();
const { updateFilters, backendEntities, filters, queryParameters } =
useEntityList();
const {
updateFilters,
backendEntities,
filters,
queryParameters: { lifecycles: lifecyclesParameter },
} = useEntityList();
const queryParamLifecycles = useMemo(
() => [queryParameters.lifecycles].flat().filter(Boolean) as string[],
[queryParameters],
() => [lifecyclesParameter].flat().filter(Boolean) as string[],
[lifecyclesParameter],
);
const [selectedLifecycles, setSelectedLifecycles] = useState(
@@ -51,12 +51,16 @@ const checkedIcon = <CheckBoxIcon fontSize="small" />;
/** @public */
export const EntityOwnerPicker = () => {
const classes = useStyles();
const { updateFilters, backendEntities, filters, queryParameters } =
useEntityList();
const {
updateFilters,
backendEntities,
filters,
queryParameters: { owners: ownersParameter },
} = useEntityList();
const queryParamOwners = useMemo(
() => [queryParameters.owners].flat().filter(Boolean) as string[],
[queryParameters],
() => [ownersParameter].flat().filter(Boolean) as string[],
[ownersParameter],
);
const [selectedOwners, setSelectedOwners] = useState(
@@ -51,7 +51,11 @@ const checkedIcon = <CheckBoxIcon fontSize="small" />;
/** @public */
export const EntityTagPicker = () => {
const classes = useStyles();
const { updateFilters, filters, queryParameters } = useEntityList();
const {
updateFilters,
filters,
queryParameters: { tags: tagsParameter },
} = useEntityList();
const catalogApi = useApi(catalogApiRef);
const { value: availableTags } = useAsync(async () => {
@@ -65,8 +69,8 @@ export const EntityTagPicker = () => {
}, [filters.kind]);
const queryParamTags = useMemo(
() => [queryParameters.tags].flat().filter(Boolean) as string[],
[queryParameters],
() => [tagsParameter].flat().filter(Boolean) as string[],
[tagsParameter],
);
const [selectedTags, setSelectedTags] = useState(
@@ -134,7 +134,7 @@ export const UserListPicker = (props: UserListPickerProps) => {
filters,
updateFilters,
backendEntities,
queryParameters,
queryParameters: { kind: kindParameter, user: userParameter },
loading: loadingBackendEntities,
} = useEntityList();
@@ -146,7 +146,7 @@ export const UserListPicker = (props: UserListPickerProps) => {
...filterGroup,
items: filterGroup.items.filter(({ id }) =>
// TODO: avoid hardcoding kinds here
['group', 'user'].some(kind => kind === queryParameters.kind)
['group', 'user'].some(kind => kind === kindParameter)
? userAndGroupFilterIds.includes(id)
: !availableFilters || availableFilters.includes(id),
),
@@ -170,8 +170,8 @@ export const UserListPicker = (props: UserListPickerProps) => {
);
const queryParamUserFilter = useMemo(
() => [queryParameters.user].flat()[0],
[queryParameters],
() => [userParameter].flat()[0],
[userParameter],
);
const [selectedUserFilter, setSelectedUserFilter] = useState(
@@ -38,26 +38,28 @@ export function useEntityTypeFilter(): {
const catalogApi = useApi(catalogApiRef);
const {
filters: { kind: kindFilter, type: typeFilter },
queryParameters,
queryParameters: { type: typeParameter },
updateFilters,
} = useEntityList();
const queryParamTypes = useMemo(
() => [queryParameters.type].flat().filter(Boolean) as string[],
[queryParameters],
const flattenedQueryTypes = useMemo(
() => [typeParameter].flat().filter(Boolean) as string[],
[typeParameter],
);
const [selectedTypes, setSelectedTypes] = useState(
queryParamTypes.length ? queryParamTypes : typeFilter?.getTypes() ?? [],
flattenedQueryTypes.length
? flattenedQueryTypes
: typeFilter?.getTypes() ?? [],
);
// Set selected types on query parameter updates; this happens at initial page load and from
// external updates to the page location.
useEffect(() => {
if (queryParamTypes.length) {
setSelectedTypes(queryParamTypes);
if (flattenedQueryTypes.length) {
setSelectedTypes(flattenedQueryTypes);
}
}, [queryParamTypes]);
}, [flattenedQueryTypes]);
const [availableTypes, setAvailableTypes] = useState<string[]>([]);
const kind = useMemo(() => kindFilter?.value, [kindFilter]);