feat(places): name every authority a place sits in
SW19 is mostly Merton but partly Wandsworth, and the page said only Merton. The cause was one field doing two jobs: _parent_authority takes the modal authority, which is right for a 301 target and wrong as a statement about where a place is. This is not a corner case. A quarter of viable outcodes (425 of 1,760) and a third of viable towns (263 of 783) cross an authority boundary — Bedford the town spans Bedford and Central Bedfordshire. Place now carries `authorities`, every authority holding at least a tenth of the schools and at least two of them, largest first. parent_authority stays single and unchanged, because a redirect still needs one target. The share threshold exists because GIAS carries postcode errors: EN6 lists two Shropshire schools among fourteen in Hertfordshire, and a bare "any authority present" rule would print those as though they were real. A place too small or too fragmented to clear the threshold still names its largest, so the page never goes silent about where it is. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015mWQnpye9F299NVRCCSRvj
This commit is contained in:
1 parent
4cea26b813
commit
1cb5314c53
7 files changed
+214
-6
No files matched your search
@@ -106,6 +106,13 @@ function SchoolTable({ schools, phase }: { schools: School[]; phase: PhaseKey })
|
||||
|
||||
export function PlaceView({ detail, phase, englandAverage, neighbours }: Props) {
|
||||
const { place, schools, averages } = detail;
|
||||
// Fall back to the single parent when the API predates the authorities
|
||||
// field, so a stale cache never blanks the line entirely.
|
||||
const authorities = place.authorities?.length
|
||||
? place.authorities
|
||||
: place.parent_authority
|
||||
? [{ name: place.parent_authority, slug: authoritySlug(place.parent_authority), count: 0 }]
|
||||
: [];
|
||||
const local = averages[METRICS[phase ?? 'primary'].key];
|
||||
const phaseWord = phase === 'secondary' ? 'Secondary schools'
|
||||
: phase === 'primary' ? 'Primary schools' : 'Schools';
|
||||
@@ -163,13 +170,20 @@ export function PlaceView({ detail, phase, englandAverage, neighbours }: Props)
|
||||
<h1>{phaseWord} in {place.name}</h1>
|
||||
<p className={styles.summary}>
|
||||
{place.count} schools
|
||||
{place.parent_authority && (
|
||||
{authorities.length > 0 && (
|
||||
<>
|
||||
{' · '}
|
||||
<Link href={`/schools/authority/${authoritySlug(place.parent_authority)}`}
|
||||
className={styles.inlineLink}>
|
||||
{place.parent_authority}
|
||||
</Link>
|
||||
{/* Every authority, not just the largest. A quarter of outcodes
|
||||
and a third of towns cross a boundary: SW19 is mostly Merton
|
||||
but partly Wandsworth, and naming one asserts otherwise. */}
|
||||
{authorities.map((a, i) => (
|
||||
<span key={a.slug}>
|
||||
{i > 0 && (i === authorities.length - 1 ? ' and ' : ', ')}
|
||||
<Link href={`/schools/authority/${a.slug}`} className={styles.inlineLink}>
|
||||
{a.name}
|
||||
</Link>
|
||||
</span>
|
||||
))}
|
||||
</>
|
||||
)}
|
||||
</p>
|
||||
|
||||
Reference in new issue
Block a user