More
This commit is contained in:
parent
cd34ee693f
commit
05a1f316e1
58 changed files with 3113 additions and 1277 deletions
|
|
@ -5,10 +5,20 @@ import {
|
|||
type TravelTimeEntry,
|
||||
type TravelTimeInitial,
|
||||
} from '../hooks/useTravelTime';
|
||||
import {
|
||||
SCHOOL_FILTER_NAME,
|
||||
createSchoolFilterKey,
|
||||
getSchoolFilterConfig,
|
||||
isSchoolFilterName,
|
||||
type SchoolDistance,
|
||||
type SchoolPhase,
|
||||
type SchoolRating,
|
||||
} from './school-filter';
|
||||
|
||||
function parseFilters(params: URLSearchParams): FeatureFilters | undefined {
|
||||
const filterParams = params.getAll('filter');
|
||||
if (filterParams.length === 0) return undefined;
|
||||
const schoolParams = params.getAll('school');
|
||||
if (filterParams.length === 0 && schoolParams.length === 0) return undefined;
|
||||
|
||||
const filters: FeatureFilters = {};
|
||||
for (const entry of filterParams) {
|
||||
|
|
@ -29,6 +39,27 @@ function parseFilters(params: URLSearchParams): FeatureFilters | undefined {
|
|||
filters[name] = [rest];
|
||||
}
|
||||
}
|
||||
|
||||
schoolParams.forEach((entry, index) => {
|
||||
const parts = entry.split(':');
|
||||
if (parts.length !== 5) return;
|
||||
const phase = parts[0] as SchoolPhase;
|
||||
const rating = parts[1] as SchoolRating;
|
||||
const distance = Number(parts[2]) as SchoolDistance;
|
||||
const min = Number(parts[3]);
|
||||
const max = Number(parts[4]);
|
||||
if (
|
||||
(phase !== 'primary' && phase !== 'secondary') ||
|
||||
(rating !== 'good' && rating !== 'outstanding') ||
|
||||
(distance !== 2 && distance !== 5) ||
|
||||
isNaN(min) ||
|
||||
isNaN(max)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
filters[createSchoolFilterKey(phase, rating, distance, index)] = [min, max];
|
||||
});
|
||||
|
||||
return Object.keys(filters).length > 0 ? filters : undefined;
|
||||
}
|
||||
|
||||
|
|
@ -126,6 +157,16 @@ export function stateToParams(
|
|||
}
|
||||
|
||||
for (const [name, value] of Object.entries(filters)) {
|
||||
const schoolConfig = getSchoolFilterConfig(name);
|
||||
if (schoolConfig && isSchoolFilterName(name)) {
|
||||
const [min, max] = value as [number, number];
|
||||
params.append(
|
||||
'school',
|
||||
`${schoolConfig.phase}:${schoolConfig.rating}:${schoolConfig.distance}:${min}:${max}`
|
||||
);
|
||||
continue;
|
||||
}
|
||||
|
||||
const meta = features.find((f) => f.name === name);
|
||||
if (meta?.type === 'enum') {
|
||||
params.append('filter', `${name}:${(value as string[]).join('|')}`);
|
||||
|
|
@ -170,13 +211,15 @@ export function summarizeParams(queryString: string): string {
|
|||
const parts: string[] = [];
|
||||
|
||||
const filterParams = params.getAll('filter');
|
||||
if (filterParams.length > 0) {
|
||||
const schoolParams = params.getAll('school');
|
||||
if (filterParams.length > 0 || schoolParams.length > 0) {
|
||||
const filterNames = filterParams
|
||||
.map((entry) => {
|
||||
const colonIdx = entry.indexOf(':');
|
||||
return colonIdx > 0 ? entry.substring(0, colonIdx) : entry;
|
||||
})
|
||||
.filter((n) => n);
|
||||
for (let i = 0; i < schoolParams.length; i++) filterNames.push(SCHOOL_FILTER_NAME);
|
||||
if (filterNames.length > 0) {
|
||||
parts.push(
|
||||
filterNames.length <= 2
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue