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>
75 lines
2.1 KiB
TypeScript
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}
|
|
/>
|
|
);
|
|
}
|
|
}
|