/** * RankingsView Component * Client-side rankings interface with filters */ 'use client'; import { useRouter, usePathname, useSearchParams } from 'next/navigation'; import { useComparison } from '@/hooks/useComparison'; import type { RankingEntry, Filters, MetricDefinition } from '@/lib/types'; import { formatPercentage, formatProgress } from '@/lib/utils'; import styles from './RankingsView.module.css'; interface RankingsViewProps { rankings: RankingEntry[]; filters: Filters; metrics: MetricDefinition[]; selectedMetric: string; selectedArea?: string; selectedYear?: number; } export function RankingsView({ rankings, filters, metrics, selectedMetric, selectedArea, selectedYear, }: RankingsViewProps) { const router = useRouter(); const pathname = usePathname(); const searchParams = useSearchParams(); const { addSchool, isSelected } = useComparison(); const updateFilters = (updates: Record) => { const params = new URLSearchParams(searchParams); Object.entries(updates).forEach(([key, value]) => { if (value) { params.set(key, value); } else { params.delete(key); } }); router.push(`${pathname}?${params.toString()}`); }; const handleMetricChange = (metric: string) => { updateFilters({ metric }); }; const handleAreaChange = (area: string) => { updateFilters({ local_authority: area || undefined }); }; const handleYearChange = (year: string) => { updateFilters({ year: year || undefined }); }; const handleAddToCompare = (ranking: RankingEntry) => { addSchool({ ...ranking, // Ensure required School fields are present address: null, postcode: null, latitude: null, longitude: null, } as any); }; // Get metric definition const currentMetricDef = metrics.find((m) => m.key === selectedMetric); const metricLabel = currentMetricDef?.label || selectedMetric; const isProgressScore = selectedMetric.includes('progress'); const isPercentage = selectedMetric.includes('pct') || selectedMetric.includes('rate'); return (
{/* Header */}

School Rankings

Top-performing schools by {metricLabel.toLowerCase()}

{/* Filters */}
{/* Rankings Table */}
{rankings.length === 0 ? (

No rankings available for the selected filters.

) : (
{rankings.map((ranking, index) => { const rank = index + 1; const isTopThree = rank <= 3; const alreadyInComparison = isSelected(ranking.urn); // Format the value let displayValue: string; if (ranking.value === null || ranking.value === undefined) { displayValue = '-'; } else if (isProgressScore) { displayValue = formatProgress(ranking.value); } else if (isPercentage) { displayValue = formatPercentage(ranking.value); } else { displayValue = ranking.value.toFixed(1); } return ( ); })}
Rank School Area Type {metricLabel} Action
{isTopThree && ( {rank === 1 && '🥇'} {rank === 2 && '🥈'} {rank === 3 && '🥉'} )} {rank} {ranking.school_name} {ranking.local_authority || '-'} {ranking.school_type || '-'} {displayValue}
)}
); }