From edf3a5fe80f2f7bbd8008f81f0db142807d1d76e Mon Sep 17 00:00:00 2001 From: Precious Oritsedere Date: Thu, 24 Sep 2026 16:36:40 +0100 Subject: [PATCH 1/4] count feed quality summary by dataset, not feed --- app/components/feed-quality/FeedQualitySection.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/components/feed-quality/FeedQualitySection.tsx b/app/components/feed-quality/FeedQualitySection.tsx index 64c0796..ef4f8e8 100644 --- a/app/components/feed-quality/FeedQualitySection.tsx +++ b/app/components/feed-quality/FeedQualitySection.tsx @@ -44,7 +44,7 @@ export function FeedQualitySection() { const filterQuery = useFeedQualityFilters(); const hasFilters = Object.keys(filterQuery).length > 0; - const { rows, groups, isLoading, error, retry } = useFeedQuality( + const { groups, isLoading, error, retry } = useFeedQuality( enabled, filterQuery ); @@ -53,13 +53,13 @@ export function FeedQualitySection() { let okCount = 0; let warningCount = 0; let errorCount = 0; - for (const row of rows) { - if (row.status === "OK") okCount += 1; - else if (row.status === "WARNING") warningCount += 1; + for (const group of groups) { + if (group.worstStatus === "OK") okCount += 1; + else if (group.worstStatus === "WARNING") warningCount += 1; else errorCount += 1; } - return { total: rows.length, okCount, warningCount, errorCount }; - }, [rows]); + return { total: groups.length, okCount, warningCount, errorCount }; + }, [groups]); // True while a fresh result is loading (first load or a new filter // combination). Only the figures and table rows swap to placeholders — the From cb8bc8cdd2eda260c2cd2c5c76d07ae905aea661 Mon Sep 17 00:00:00 2001 From: Precious Oritsedere Date: Thu, 24 Sep 2026 16:37:42 +0100 Subject: [PATCH 2/4] call summary counts data providers, not streams --- app/components/feed-quality/FeedQualitySummary.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/components/feed-quality/FeedQualitySummary.tsx b/app/components/feed-quality/FeedQualitySummary.tsx index 34244d7..349eddc 100644 --- a/app/components/feed-quality/FeedQualitySummary.tsx +++ b/app/components/feed-quality/FeedQualitySummary.tsx @@ -55,11 +55,11 @@ export function FeedQualitySummary({ return (

- Data stream status + Data provider status

@@ -72,8 +72,8 @@ export function FeedQualitySummary({ {!loading && total === 1 - ? "data stream tracked" - : "data streams tracked"} + ? "data provider tracked" + : "data providers tracked"}

From 9e4ca94893b7a406ec6edc7cdd3651e7c593d16b Mon Sep 17 00:00:00 2001 From: Precious Oritsedere Date: Thu, 24 Sep 2026 16:38:53 +0100 Subject: [PATCH 3/4] say data providers in quality filter and empty states --- app/components/feed-quality/FeedQualitySection.tsx | 6 +++--- app/components/feed-quality/FeedQualityStatusFilter.tsx | 2 +- app/components/feed-quality/FeedQualityTable.tsx | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/components/feed-quality/FeedQualitySection.tsx b/app/components/feed-quality/FeedQualitySection.tsx index ef4f8e8..e6e6bf7 100644 --- a/app/components/feed-quality/FeedQualitySection.tsx +++ b/app/components/feed-quality/FeedQualitySection.tsx @@ -101,7 +101,7 @@ export function FeedQualitySection() { role="status" aria-live="polite" > - Showing data streams that match your filters above. + Showing data providers that match your filters above.

)} {error ? ( @@ -145,7 +145,7 @@ function EmptyState() { No data quality data yet.

- OpenActive hasn't assessed any data streams in this window. Check back + OpenActive hasn't assessed any data providers in this window. Check back once data providers have started sharing data.

@@ -156,7 +156,7 @@ function NoMatchesState() { return (

- No data streams match your current filters. + No data providers match your current filters.

Try removing a filter above to widen the search. diff --git a/app/components/feed-quality/FeedQualityStatusFilter.tsx b/app/components/feed-quality/FeedQualityStatusFilter.tsx index a358d5c..acd38ea 100644 --- a/app/components/feed-quality/FeedQualityStatusFilter.tsx +++ b/app/components/feed-quality/FeedQualityStatusFilter.tsx @@ -101,7 +101,7 @@ export function FeedQualityStatusFilter({

{ const count = filteredGroups.length; - const noun = count === 1 ? "data stream" : "data streams"; + const noun = count === 1 ? "data provider" : "data providers"; if (!hasActiveFilters) return ""; return count === 0 - ? "No data streams match the current filters." + ? "No data providers match the current filters." : `${count} ${noun} match the current filters.`; }, [filteredGroups.length, hasActiveFilters]); @@ -388,7 +388,7 @@ export function FeedQualityTable({ {!loading && filteredGroups.length === 0 ? (

- No data streams match those filters. + No data providers match those filters.

{query @@ -493,7 +493,7 @@ export function FeedQualityTable({ aria-live="polite" className="px-3 py-3 text-center text-xs text-oa-grey-500" > - Loading more data streams… + Loading more data providers…

)}
From d1f43ed16f7781a69832f00c182acaa3a28e33a6 Mon Sep 17 00:00:00 2001 From: Precious Oritsedere Date: Thu, 24 Sep 2026 16:40:17 +0100 Subject: [PATCH 4/4] document that quality status counts use providers --- docs/feed-quality.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/feed-quality.md b/docs/feed-quality.md index c8f4d1e..b062bc5 100644 --- a/docs/feed-quality.md +++ b/docs/feed-quality.md @@ -28,6 +28,8 @@ If the API fails, the failed key is dropped so Retry can try again. `groupFeedsByDataset` in `app/lib/feed-quality.ts` groups rows by dataset. +Each group gets a `worstStatus` (the most severe status among that dataset's feeds). The summary overview and the All / Healthy / Warnings / Errors chips both count **data providers** (dataset groups) by that `worstStatus`, so their totals match the table. Individual feed statuses still show when a group is expanded. + The UI has two views (`FeedQualityViewToggle`): - **Data completeness** - core fields used for headline opportunity figures (dates, location, activity or facility) @@ -35,7 +37,7 @@ The UI has two views (`FeedQualityViewToggle`): Completeness bands (high / moderate / low / none / not assessed) are defined in `COMPLETENESS_BANDS` in the same file. Colour cells use those bands. -Each feeds also has a status: `OK`, `WARNING`, or `ERROR` (shown as Healthy / Warning / Error). +Each feed also has a status: `OK`, `WARNING`, or `ERROR` (shown as Healthy / Warning / Error). ## Opportunities column