fix(compare): give every basket entry a real phase
PR Checks / Frontend Typecheck + Tests (pull_request) Successful in 1m13s
PR Checks / Backend Smoke (pull_request) Successful in 9s
PR Checks / Build Backend (no push) (pull_request) Successful in 17s
PR Checks / Build Frontend (no push) (pull_request) Canceled after 1m6s
PR Checks / Build Pipeline (no push) (pull_request) Canceled after 0s
PR Checks / AI Code Review (Claude) (pull_request) Canceled after 0s
PR Checks / Frontend Typecheck + Tests (pull_request) Successful in 1m13s
PR Checks / Backend Smoke (pull_request) Successful in 9s
PR Checks / Build Backend (no push) (pull_request) Successful in 17s
PR Checks / Build Frontend (no push) (pull_request) Canceled after 1m6s
PR Checks / Build Pipeline (no push) (pull_request) Canceled after 0s
PR Checks / AI Code Review (Claude) (pull_request) Canceled after 0s
Review of the per-phase limit found entries reaching the basket with no phase, and a phase-less entry holds a slot in both groups: - Nearby-school cards added without one. The API now returns each peer's own phase (its pool is a phase group, so an all-through school can sit beside a primary); the button passes it through, and an older API simply leaves the conservative both-groups count in place. - Baskets saved before this change were never migrated. The compare page now backfills missing phases from the data it already fetches, and never overwrites a phase the basket has. - "16 plus" counted against both groups; it is secondary, as the API's PHASE_GROUPS files it. Also rewraps the HomeView doc comment the previous commit left awkward. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
0a4c051ee5
commit
587cfe3f0b
11 files changed
+175
-6
No files matched your search
@@ -17,6 +17,8 @@ interface ComparisonContextType {
|
||||
addSchool: (school: School) => void;
|
||||
removeSchool: (urn: number) => void;
|
||||
replaceSchools: (schools: School[]) => void;
|
||||
/** Fill in phases missing from stored entries; never overwrites one. */
|
||||
backfillPhases: (phases: Record<number, string | null | undefined>) => void;
|
||||
clearAll: () => void;
|
||||
isSelected: (urn: number) => boolean;
|
||||
/** The comparison group with no room for this school, or null. */
|
||||
|
||||
@@ -72,6 +72,22 @@ export function ComparisonProvider({ children }: { children: React.ReactNode })
|
||||
setSelectedSchools(fitToGroupLimits(schools));
|
||||
}, []);
|
||||
|
||||
// Baskets saved before phases were recorded (or added from a path that
|
||||
// lacked one) count against both groups. Fill the gaps once the compare
|
||||
// page has fetched each school, so they stop holding a slot they don't need.
|
||||
const backfillPhases = useCallback((phases: Record<number, string | null | undefined>) => {
|
||||
setSelectedSchools((prev) => {
|
||||
let changed = false;
|
||||
const next = prev.map((s) => {
|
||||
const phase = phases[s.urn];
|
||||
if (s.phase || !phase) return s;
|
||||
changed = true;
|
||||
return { ...s, phase };
|
||||
});
|
||||
return changed ? next : prev;
|
||||
});
|
||||
}, []);
|
||||
|
||||
const clearAll = useCallback(() => {
|
||||
setSelectedSchools([]);
|
||||
}, []);
|
||||
@@ -99,6 +115,7 @@ export function ComparisonProvider({ children }: { children: React.ReactNode })
|
||||
addSchool,
|
||||
removeSchool,
|
||||
replaceSchools,
|
||||
backfillPhases,
|
||||
clearAll,
|
||||
isSelected,
|
||||
fullGroupFor: fullGroupForSchool,
|
||||
|
||||
Reference in new issue
Block a user