From 67e2c96ca72051a1b1cd2ed97770fc545ac14144 Mon Sep 17 00:00:00 2001 From: Craig Williams Date: Fri, 16 Oct 2026 16:26:32 +0100 Subject: [PATCH] Added an SME suitable filter --- web/src/components/FilterPanel.tsx | 14 ++++++++++++++ web/src/lib/filterOpportunities.ts | 5 +++++ 2 files changed, 19 insertions(+) diff --git a/web/src/components/FilterPanel.tsx b/web/src/components/FilterPanel.tsx index 7c6e2a2..502de94 100644 --- a/web/src/components/FilterPanel.tsx +++ b/web/src/components/FilterPanel.tsx @@ -176,6 +176,20 @@ export function FilterPanel(props: Props): JSX.Element { + +
+ Suitability +
+ +
+
; /** Classification ids; empty means every classification. */ classificationIds: ReadonlySet; + /** Only opportunities suitable for SMEs; false means any. */ + smeSuitable: boolean; showHidden: boolean; } @@ -25,6 +27,7 @@ export const emptyFilters = (): OpportunityFilters => ({ statuses: new Set(), marks: new Set(), classificationIds: new Set(), + smeSuitable: false, showHidden: false, }); @@ -35,6 +38,7 @@ export const activeFilterCount = (filters: OpportunityFilters): number => filters.statuses.size > 0, filters.marks.size > 0, filters.classificationIds.size > 0, + filters.smeSuitable, filters.showHidden, ].filter(Boolean).length; @@ -56,6 +60,7 @@ export function filterOpportunities( if (!filters.showHidden && annotation.hidden) return false; if (query && !opportunity.title.toLocaleLowerCase().includes(query)) return false; if (filters.statuses.size > 0 && !filters.statuses.has(opportunity.status)) return false; + if (filters.smeSuitable && !opportunity.sme_suitable) return false; if (filters.marks.size > 0) { const matches = annotation.marks.length === 0