Files
school_compare/nextjs-app/app/rankings/page.tsx
Tudor 148e46ae6a
Some checks failed
Build and Push Docker Images / Build Backend (FastAPI) (push) Successful in 34s
Build and Push Docker Images / Build Frontend (Next.js) (push) Failing after 59s
Build and Push Docker Images / Trigger Portainer Update (push) Has been skipped
Fix filters API response structure
Backend returns filters directly at top level, not wrapped in 'filters' property.
Update FiltersResponse type and page components to match actual API response.

Fixes empty dropdowns for school types and local authorities.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-02 21:51:08 +00:00

75 lines
2.1 KiB
TypeScript

/**
* Rankings Page (SSR)
* Display top-ranked schools by various metrics
*/
import { fetchRankings, fetchFilters, fetchMetrics } from '@/lib/api';
import { RankingsView } from '@/components/RankingsView';
import type { Metadata } from 'next';
interface RankingsPageProps {
searchParams: Promise<{
metric?: string;
local_authority?: string;
year?: string;
}>;
}
export const metadata: Metadata = {
title: 'School Rankings',
description: 'Top-ranked primary schools by KS2 performance across England',
keywords: 'school rankings, top schools, best schools, KS2 rankings, school league tables',
};
// Force dynamic rendering
export const dynamic = 'force-dynamic';
export default async function RankingsPage({ searchParams }: RankingsPageProps) {
const { metric: metricParam, local_authority, year: yearParam } = await searchParams;
const metric = metricParam || 'rwm_expected_pct';
const year = yearParam ? parseInt(yearParam) : undefined;
// Fetch rankings data with error handling
try {
const [rankingsResponse, filtersResponse, metricsResponse] = await Promise.all([
fetchRankings({
metric,
local_authority,
year,
limit: 100,
}),
fetchFilters(),
fetchMetrics(),
]);
// Convert metrics object to array
const metricsArray = Object.values(metricsResponse?.metrics || {});
return (
<RankingsView
rankings={rankingsResponse?.rankings || []}
filters={filtersResponse || { local_authorities: [], school_types: [], years: [] }}
metrics={metricsArray}
selectedMetric={metric}
selectedArea={local_authority}
selectedYear={year}
/>
);
} catch (error) {
console.error('Error fetching data for rankings page:', error);
// Return error state with empty data
return (
<RankingsView
rankings={[]}
filters={{ local_authorities: [], school_types: [], years: [] }}
metrics={[]}
selectedMetric={metric}
selectedArea={local_authority}
selectedYear={year}
/>
);
}
}