Skip to content

Commit 2cd673e

Browse files
feat(Extensions): integrate search query with filter dropdown counts for dynamic filtering (#1717)
* feat(marketplace): integrate search query with filter dropdown counts * Updated changeset patch version Co-authored-by: Karthik Jeeyar <karthik@redhat.com> --------- Co-authored-by: Karthik Jeeyar <karthik@redhat.com>
1 parent a416e91 commit 2cd673e

3 files changed

Lines changed: 32 additions & 1 deletion

File tree

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
'@red-hat-developer-hub/backstage-plugin-marketplace': patch
3+
---
4+
5+
Integrate search query with filter dropdown counts for dynamic filtering
6+
7+
- Ensure filter dropdowns show only relevant options after search is applied
8+
- Maintain AND logic across search + category + author + support filters

workspaces/marketplace/plugins/marketplace/src/hooks/useFilteredPluginFacet.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export const useFilteredPluginFacet = (
3434
const marketplaceApi = useMarketplaceApi();
3535

3636
const filters = searchParams.getAll('filter');
37+
const fullTextSearch = searchParams.get('q');
3738

3839
// Get all plugins and apply client-side filtering for accurate facet calculation
3940
const pluginsQuery = useQuery({
@@ -50,6 +51,7 @@ export const useFilteredPluginFacet = (
5051
'getFilteredPluginFacet',
5152
facet,
5253
filters,
54+
fullTextSearch,
5355
excludeFilterType,
5456
],
5557
queryFn: async () => {
@@ -82,6 +84,16 @@ export const useFilteredPluginFacet = (
8284

8385
let filteredPlugins = pluginsQuery.data.items;
8486

87+
// Apply search filter first (always applied, not excluded)
88+
if (fullTextSearch) {
89+
const lowerCaseSearch = fullTextSearch.toLocaleLowerCase('en-US');
90+
filteredPlugins = filteredPlugins.filter(plugin => {
91+
const lowerCaseValue =
92+
plugin.metadata?.title?.toLocaleLowerCase('en-US');
93+
return lowerCaseValue?.includes(lowerCaseSearch);
94+
});
95+
}
96+
8597
// Apply category filters
8698
const categories = activeFilters
8799
.filter(filter => filter.startsWith('category='))

workspaces/marketplace/plugins/marketplace/src/hooks/useFilteredSupportTypes.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export const useFilteredSupportTypes = () => {
3939
const marketplaceApi = useMarketplaceApi();
4040

4141
const filters = searchParams.getAll('filter');
42+
const fullTextSearch = searchParams.get('q');
4243

4344
// Get all plugins (not pre-filtered)
4445
const allPluginsQuery = useQuery({
@@ -67,6 +68,16 @@ export const useFilteredSupportTypes = () => {
6768

6869
let availablePlugins = allPluginsQuery.data.items;
6970

71+
// Apply search filter first (always applied)
72+
if (fullTextSearch) {
73+
const lowerCaseSearch = fullTextSearch.toLocaleLowerCase('en-US');
74+
availablePlugins = availablePlugins.filter(plugin => {
75+
const lowerCaseValue =
76+
plugin.metadata?.title?.toLocaleLowerCase('en-US');
77+
return lowerCaseValue?.includes(lowerCaseSearch);
78+
});
79+
}
80+
7081
// Apply category filter if present
7182
const categories = nonSupportFilters
7283
.filter(filter => filter.startsWith('category='))
@@ -204,7 +215,7 @@ export const useFilteredSupportTypes = () => {
204215
(a, b) => (a.displayOrder || 0) - (b.displayOrder || 0),
205216
);
206217
return result;
207-
}, [allPluginsQuery.data?.items, nonSupportFilters, t]);
218+
}, [allPluginsQuery.data?.items, nonSupportFilters, fullTextSearch, t]);
208219

209220
return {
210221
data: items,

0 commit comments

Comments
 (0)