From f8f503522535a70accf826d192f9ea1c619506a2 Mon Sep 17 00:00:00 2001
From: "2569718930@qq.com" <2569718930@qq.com>
Date: Fri, 29 May 2026 18:40:29 +0800
Subject: [PATCH] Fix runway chart collapse and ops cleanup
---
.../scan-terminal/TemperatureChartCanvas.tsx | 26 ++--
...temperatureDefaultVisibilityPolicy.test.ts | 58 ++++++++
.../scan-terminal/temperature-chart-logic.ts | 54 ++++++-
.../production_remediation_20260529.sql | 138 ++++++++++++++++++
src/utils/online_tracker.py | 4 +-
tests/test_online_tracker.py | 27 ++++
6 files changed, 288 insertions(+), 19 deletions(-)
create mode 100644 scripts/supabase/production_remediation_20260529.sql
create mode 100644 tests/test_online_tracker.py
diff --git a/frontend/components/dashboard/scan-terminal/TemperatureChartCanvas.tsx b/frontend/components/dashboard/scan-terminal/TemperatureChartCanvas.tsx
index 7a0ef5d9..0ca50dba 100644
--- a/frontend/components/dashboard/scan-terminal/TemperatureChartCanvas.tsx
+++ b/frontend/components/dashboard/scan-terminal/TemperatureChartCanvas.tsx
@@ -15,7 +15,11 @@ import {
} from "recharts";
import type { ScanOpportunityRow } from "@/lib/dashboard-types";
import { TemperatureTooltipContent } from "@/components/dashboard/scan-terminal/TemperatureTooltipContent";
-import type { EvidenceSeries, ProbabilityOverlay } from "@/components/dashboard/scan-terminal/temperature-chart-logic";
+import {
+ getTemperatureSeriesForRunwayDetailsMode,
+ type EvidenceSeries,
+ type ProbabilityOverlay,
+} from "@/components/dashboard/scan-terminal/temperature-chart-logic";
type CityThreshold = {
threshold: number;
@@ -120,23 +124,25 @@ export function TemperatureChartCanvas({
const individualRunwaySeriesCount = chartSeries.filter(
(series) => series.key.startsWith("runway_") && series.key !== "runway_max",
).length;
+ const collapsedRunwaySeries = getTemperatureSeriesForRunwayDetailsMode(
+ row?.city || "",
+ chartSeries,
+ false,
+ );
const canToggleRunwayDetails =
hasRunwayData &&
individualRunwaySeriesCount > 1 &&
- chartSeries.some((series) => series.key === "runway_max");
+ collapsedRunwaySeries.length < chartSeries.length;
return (
{chartSeries.length > 1 &&
- chartSeries
- .filter((s) => {
- const isIndividualRunway = s.key.startsWith("runway_") && s.key !== "runway_max";
- if (showRunwayDetails) {
- return s.key !== "runway_max";
- }
- return !isIndividualRunway;
- })
+ getTemperatureSeriesForRunwayDetailsMode(
+ row?.city || "",
+ chartSeries,
+ showRunwayDetails,
+ )
.map((s) => (