From 918e7dbe029e3cb7f59033fb9f2b1bd9bba8027c Mon Sep 17 00:00:00 2001 From: Chaim Date: Sat, 25 Apr 2026 14:55:27 +0000 Subject: [PATCH] =?UTF-8?q?feat(ui):=20smart=20proximity=20label=20?= =?UTF-8?q?=E2=80=94=20infer=20street=20from=20deal=20data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instead of showing "סביבה קרובה" for all street-polygon deals, we now infer the searched street from the most common streetNameHeb among deal_source="street" deals. Deals on that street get "אותו רחוב" (blue); deals on other streets get "סביבה קרובה" (lighter blue). Works correctly for both address searches and gush+plot searches. Co-Authored-By: Claude Opus 4.7 (1M context) --- web/src/components/DealsTable.tsx | 43 +++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/web/src/components/DealsTable.tsx b/web/src/components/DealsTable.tsx index e980887..41d2a0c 100644 --- a/web/src/components/DealsTable.tsx +++ b/web/src/components/DealsTable.tsx @@ -5,11 +5,34 @@ interface Props { deals: Deal[]; } -const SOURCE_LABELS: Record = { - same_building: "אותו בניין", - street: "סביבה קרובה", - neighborhood: "שכונה", -}; +function inferStreetName(deals: Deal[]): string | null { + const freq: Record = {}; + for (const d of deals) { + if (d.deal_source === "street" && d.streetNameHeb) { + freq[d.streetNameHeb] = (freq[d.streetNameHeb] ?? 0) + 1; + } + } + const entries = Object.entries(freq); + if (!entries.length) return null; + return entries.reduce((a, b) => (b[1] > a[1] ? b : a))[0]; +} + +function proximityLabel(deal: Deal, inferredStreet: string | null): string { + if (!deal.deal_source) return "—"; + if (deal.deal_source === "same_building") return "אותו בניין"; + if (deal.deal_source === "neighborhood") return "שכונה"; + // "street" source — check if actually same street + if (inferredStreet && deal.streetNameHeb === inferredStreet) return "אותו רחוב"; + return "סביבה קרובה"; +} + +function proximityClass(deal: Deal, inferredStreet: string | null): string { + if (deal.deal_source === "same_building") return "bg-emerald-100 text-emerald-800"; + if (deal.deal_source === "street" && inferredStreet && deal.streetNameHeb === inferredStreet) + return "bg-blue-100 text-blue-800"; + if (deal.deal_source === "street") return "bg-sky-50 text-sky-700"; + return "bg-slate-100 text-slate-700"; +} export function DealsTable({ deals }: Props) { if (!deals.length) { @@ -20,6 +43,8 @@ export function DealsTable({ deals }: Props) { ); } + const inferredStreet = inferStreetName(deals); + return (
@@ -67,14 +92,10 @@ export function DealsTable({ deals }: Props) { - {SOURCE_LABELS[d.deal_source] || d.deal_source} + {proximityLabel(d, inferredStreet)} ) : ( "—"