Skip to content

Commit 25f332c

Browse files
Merge pull request #11161 from divyanshiGupta/sb-discoverability
Sort catalog filters and other enhancements
2 parents 1f4beaa + ddcb90c commit 25f332c

6 files changed

Lines changed: 66 additions & 45 deletions

File tree

frontend/packages/console-shared/src/components/catalog/catalog-view/CatalogFilters.tsx

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@ import {
55
FilterSidePanelCategoryItem,
66
} from '@patternfly/react-catalog-view-extension';
77
import * as _ from 'lodash';
8-
import { CatalogFilterCounts, CatalogFilters } from '../utils/types';
8+
import {
9+
CatalogFilter,
10+
CatalogFilterCounts,
11+
CatalogFilterItem,
12+
CatalogFilters,
13+
} from '../utils/types';
914

1015
type CatalogFiltersProps = {
1116
activeFilters: CatalogFilters;
@@ -24,7 +29,14 @@ const CatalogFilters: React.FC<CatalogFiltersProps> = ({
2429
onFilterChange,
2530
onShowAllToggle,
2631
}) => {
27-
const renderFilterItem = (filter, filterName, groupName) => {
32+
const sortedActiveFilters = Object.keys(activeFilters)
33+
.sort()
34+
.reduce<CatalogFilters>((acc, groupName) => {
35+
acc[groupName] = activeFilters[groupName];
36+
return acc;
37+
}, {});
38+
39+
const renderFilterItem = (filter: CatalogFilterItem, filterName: string, groupName: string) => {
2840
const { label, active } = filter;
2941
const count = filterGroupCounts[groupName]?.[filterName] ?? 0;
3042
// TODO remove when adopting https://github.com/patternfly/patternfly-react/issues/5139
@@ -47,24 +59,35 @@ const CatalogFilters: React.FC<CatalogFiltersProps> = ({
4759
);
4860
};
4961

50-
const renderFilterGroup = (filterGroup, groupName) =>
51-
Object.keys(filterGroup).length > 1 ? (
52-
<FilterSidePanelCategory
53-
key={groupName}
54-
title={filterGroupNameMap[groupName] || groupName}
55-
onShowAllToggle={() => onShowAllToggle(groupName)}
56-
showAll={filterGroupsShowAll[groupName] ?? false}
57-
data-test-group-name={groupName}
58-
>
59-
{_.map(filterGroup, (filter, filterName) =>
60-
renderFilterItem(filter, filterName, groupName),
61-
)}
62-
</FilterSidePanelCategory>
63-
) : null;
62+
const renderFilterGroup = (filterGroup: CatalogFilter, groupName: string) => {
63+
const filterGroupKeys = Object.keys(filterGroup);
64+
if (filterGroupKeys.length > 1) {
65+
const sortedFilterGroup = filterGroupKeys.sort().reduce<CatalogFilter>((acc, filterName) => {
66+
acc[filterName] = filterGroup[filterName];
67+
return acc;
68+
}, {});
69+
return (
70+
<FilterSidePanelCategory
71+
key={groupName}
72+
title={filterGroupNameMap[groupName] || groupName}
73+
onShowAllToggle={() => onShowAllToggle(groupName)}
74+
showAll={filterGroupsShowAll[groupName] ?? false}
75+
data-test-group-name={groupName}
76+
>
77+
{_.map(sortedFilterGroup, (filter, filterName) =>
78+
renderFilterItem(filter, filterName, groupName),
79+
)}
80+
</FilterSidePanelCategory>
81+
);
82+
}
83+
return null;
84+
};
6485

6586
return (
6687
<FilterSidePanel>
67-
{_.map(activeFilters, (filterGroup, groupName) => renderFilterGroup(filterGroup, groupName))}
88+
{_.map(sortedActiveFilters, (filterGroup, groupName) =>
89+
renderFilterGroup(filterGroup, groupName),
90+
)}
6891
</FilterSidePanel>
6992
);
7093
};

frontend/packages/console-shared/src/components/catalog/service/CatalogServiceProvider.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ const CatalogServiceProvider: React.FC<CatalogServiceProviderProps> = ({
3636
const [extItemsMap, setExtItemsMap] = React.useState<{ [uid: string]: CatalogItem[] }>({});
3737
const [extItemsErrorMap, setItemsErrorMap] = React.useState<{ [uid: string]: Error }>({});
3838
const [metadataProviderMap, setMetadataProviderMap] = React.useState<{
39-
[type: string]: CatalogItemMetadataProviderFunction[];
39+
[type: string]: { [id: string]: CatalogItemMetadataProviderFunction };
4040
}>({});
4141

4242
const loaded =
@@ -79,8 +79,11 @@ const CatalogServiceProvider: React.FC<CatalogServiceProviderProps> = ({
7979
setItemsErrorMap((prev) => ({ ...prev, [uid]: error }));
8080
}, []);
8181

82-
const onMetadataValueResolved = React.useCallback((provider, type) => {
83-
setMetadataProviderMap((prev) => ({ ...prev, [type]: [...(prev?.[type] ?? []), provider] }));
82+
const onMetadataValueResolved = React.useCallback((provider, uid, type) => {
83+
setMetadataProviderMap((prev) => ({
84+
...prev,
85+
[type]: { ...(prev?.[type] ?? {}), [uid]: provider },
86+
}));
8487
}, []);
8588

8689
const searchCatalog = React.useCallback(
@@ -148,7 +151,9 @@ const CatalogServiceProvider: React.FC<CatalogServiceProviderProps> = ({
148151
id={extension.uid}
149152
useValue={extension.properties.provider}
150153
options={defaultOptions}
151-
onValueResolved={(value) => onMetadataValueResolved(value, extension.properties.type)}
154+
onValueResolved={(value, uid) =>
155+
onMetadataValueResolved(value, uid, extension.properties.type)
156+
}
152157
/>
153158
))}
154159
{children(catalogService)}

frontend/packages/console-shared/src/components/catalog/utils/__tests__/catalog-utils.spec.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ describe('catalog-utils#applyCatalogItemMetadata', () => {
3434
},
3535
];
3636
const metadataProviderMap: {
37-
[type: string]: CatalogItemMetadataProviderFunction[];
37+
[type: string]: { [id: string]: CatalogItemMetadataProviderFunction };
3838
} = {
39-
type1: [
40-
() => ({
39+
type1: {
40+
'@console/dev-console[49]': () => ({
4141
tags: ['foo', 'bar'],
4242
attributes: {
4343
foo: 'bar',
@@ -51,7 +51,7 @@ describe('catalog-utils#applyCatalogItemMetadata', () => {
5151
},
5252
],
5353
}),
54-
],
54+
},
5555
};
5656

5757
const result = applyCatalogItemMetadata(catalogItems, metadataProviderMap);

frontend/packages/console-shared/src/components/catalog/utils/catalog-utils.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,11 @@ export const customPropertyPresent = (
9494
export const applyCatalogItemMetadata = (
9595
catalogItems: CatalogItem[],
9696
metadataProviderMap: {
97-
[type: string]: CatalogItemMetadataProviderFunction[];
97+
[type: string]: { [id: string]: CatalogItemMetadataProviderFunction };
9898
},
9999
) =>
100100
catalogItems.map((item) => {
101-
const metadataProviders = metadataProviderMap[item.type];
101+
const metadataProviders = Object.values(metadataProviderMap[item.type] ?? {});
102102
if (metadataProviders?.length) {
103103
const metadata = metadataProviders
104104
.map((metadataProvider) => metadataProvider(item))

frontend/packages/dev-console/console-extensions.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@
285285
]
286286
},
287287
"flags": {
288-
"required": ["OPENSHIFT"]
288+
"required": ["ALLOW_SERVICE_BINDING"]
289289
}
290290
},
291291
{
@@ -296,7 +296,7 @@
296296
"provider": { "$codeRef": "catalog.bindableItemMetadataProvider" }
297297
},
298298
"flags": {
299-
"required": ["OPENSHIFT"]
299+
"required": ["ALLOW_SERVICE_BINDING"]
300300
}
301301
},
302302
{

frontend/packages/dev-console/src/components/catalog/providers/useBindableItemMetadataProvider.ts

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,18 @@ import {
55
CatalogItemMetadataProviderFunction,
66
ExtensionHook,
77
} from '@console/dynamic-plugin-sdk';
8-
import { fetchBindableServices } from '../../topology/bindable-services/fetch-bindable-services-utils';
8+
import { getGroupVersionKindForModel } from '@console/dynamic-plugin-sdk/src/lib-core';
9+
import { useK8sWatchResource } from '@console/internal/components/utils/k8s-watch-hook';
10+
import { BindableServicesModel } from '../../topology/bindable-services/models';
11+
import { BindableServiceGVK, BindableServicesKind } from '../../topology/bindable-services/types';
912

1013
const useBindableItemMetadataProvider: ExtensionHook<CatalogItemMetadataProviderFunction> = () => {
11-
const [bindableServices, setBindableServices] = React.useState([]);
12-
const [loaded, setLoaded] = React.useState(false);
13-
const [error, setError] = React.useState(null);
14+
const [bindableKindsRes, loaded, error] = useK8sWatchResource<BindableServicesKind>({
15+
groupVersionKind: getGroupVersionKindForModel(BindableServicesModel),
16+
name: 'bindable-kinds',
17+
});
1418

15-
React.useEffect(() => {
16-
fetchBindableServices()
17-
.then((resp) => {
18-
setBindableServices(resp);
19-
setLoaded(true);
20-
})
21-
.catch((e) => {
22-
setBindableServices([]);
23-
setLoaded(true);
24-
setError(e);
25-
});
26-
}, []);
19+
const bindableServices: BindableServiceGVK[] = bindableKindsRes?.status ?? [];
2720

2821
const [t] = useTranslation();
2922

0 commit comments

Comments
 (0)