diff --git a/frontend/components/dashboard/scan-terminal/UpdateAnnouncementButton.tsx b/frontend/components/dashboard/scan-terminal/UpdateAnnouncementButton.tsx index 2b0c5a67..8c604768 100644 --- a/frontend/components/dashboard/scan-terminal/UpdateAnnouncementButton.tsx +++ b/frontend/components/dashboard/scan-terminal/UpdateAnnouncementButton.tsx @@ -24,22 +24,22 @@ const UPDATE_ANNOUNCEMENT_SEEN_KEY = "polyweather_update_announcement_seen_v1"; const STATIC_UPDATE_ANNOUNCEMENTS: StaticUpdateAnnouncement[] = [ { - id: "live-observation-chart-2026-06", - publishedAt: "2026-06-17T00:00:00+08:00", - expiresAt: "2026-07-31T00:00:00+08:00", + id: "model-summary-table-2026-06-29", + publishedAt: "2026-06-29T19:20:00+08:00", + expiresAt: "2026-08-15T00:00:00+08:00", zh: { - title: "更新公告:实时观测和图表稳定性升级", + title: "更新公告:模型汇总表上线", body: - "实时观测链路已和模型缓存拆分:SSE 到达会立即更新图表;如果 SSE 断线,终端会每 3 分钟拉取一次轻量观测兜底。DEB、模型曲线、概率和历史数据继续走独立缓存,不再跟着实时温度强刷。\n\n" + - "这次也补齐了更多官方观测覆盖,包括东京 JMA、韩国 AMOS、土耳其 MGM、台北 CWA 等,并修正 NOAA MADIS 只应用于美国城市,避免非美国城市串台。\n\n" + - "图表侧同步修复了预测曲线缺段、首屏 loading 不明显、旧缓存覆盖最新观测等问题。刷新终端后即可使用新逻辑。", + "终端左侧新增「模型汇总」菜单,按今日最高温口径汇总全部城市:当前最高、DEB 预测,以及 ECMWF、ECMWF AIFS、GFS、ICON、ICON-EU、GEM、GDPS、JMA、AROME HD、HRRR、NAM 等模型高温预测集中到一张表里。\n\n" + + "缺失模型会显示 —;模型中位数和分歧范围只基于已有模型值计算,方便快速发现 DEB 与多模型之间的偏离。\n\n" + + "页面支持搜索城市或模型,并提供「仅 DEB」和「分歧较大」筛选。移动端可横向滚动,首列城市固定。刷新终端后即可使用。", }, en: { - title: "Update: live observations and chart stability", + title: "Update: Model Summary table is live", body: - "Live observations are now separated from cached model detail. SSE patches update charts immediately; if SSE is unavailable, the terminal falls back to a lightweight observation fetch every 3-minute interval. DEB, model curves, probabilities, and historical data stay on their own cache path instead of refreshing with every live temperature update.\n\n" + - "Official observation coverage has also expanded, including Tokyo JMA, Korea AMOS, Turkey MGM, and Taipei CWA. NOAA MADIS is now restricted to US cities to avoid cross-region source leakage.\n\n" + - "Charts also include fixes for truncated forecast curves, first-load chart loading visibility, and stale cache overriding newer observations. Refresh the terminal to use the new flow.", + "The left terminal navigation now includes Model Summary, a city-by-city table for today's high-temperature view: current high, DEB forecast, plus ECMWF, ECMWF AIFS, GFS, ICON, ICON-EU, GEM, GDPS, JMA, AROME HD, HRRR, and NAM model highs in one workspace.\n\n" + + "Missing models render as —. Model median and spread are calculated only from available model values, making it easier to spot where DEB diverges from the model cluster.\n\n" + + "The page supports city or model search, plus Only DEB and Large spread filters. Mobile keeps the city column sticky with horizontal table scrolling. Refresh the terminal to use it.", }, }, ]; diff --git a/frontend/components/dashboard/scan-terminal/__tests__/updateAnnouncement.test.ts b/frontend/components/dashboard/scan-terminal/__tests__/updateAnnouncement.test.ts index d787d93d..2dc8968b 100644 --- a/frontend/components/dashboard/scan-terminal/__tests__/updateAnnouncement.test.ts +++ b/frontend/components/dashboard/scan-terminal/__tests__/updateAnnouncement.test.ts @@ -70,32 +70,40 @@ export function runTests() { "announcement component must persist seen announcement ids and render an unread indicator for unseen updates", ); assert( - componentSource.includes("实时观测链路已和模型缓存拆分") && - componentSource.includes("SSE") && - componentSource.includes("3 分钟") && + componentSource.includes("模型汇总表上线") && + componentSource.includes("模型汇总") && componentSource.includes("DEB") && + componentSource.includes("ECMWF") && + componentSource.includes("ECMWF AIFS") && + componentSource.includes("GFS") && + componentSource.includes("ICON-EU") && componentSource.includes("JMA") && - componentSource.includes("AMOS") && - componentSource.includes("MGM") && - componentSource.includes("CWA") && - componentSource.includes("NOAA MADIS") && - componentSource.includes("预测曲线缺段") && - componentSource.includes("首屏 loading"), - "terminal announcement should summarize the live-observation architecture update and recent chart fixes in Chinese", + componentSource.includes("AROME HD") && + componentSource.includes("HRRR") && + componentSource.includes("NAM") && + componentSource.includes("模型中位数") && + componentSource.includes("分歧范围") && + componentSource.includes("仅 DEB") && + componentSource.includes("分歧较大"), + "terminal announcement should summarize the model summary table release in Chinese", ); assert( - componentSource.includes("Live observations are now separated from cached model detail") && - componentSource.includes("SSE") && - componentSource.includes("3-minute") && + componentSource.includes("Model Summary table is live") && + componentSource.includes("city-by-city table") && componentSource.includes("DEB") && + componentSource.includes("ECMWF") && + componentSource.includes("ECMWF AIFS") && + componentSource.includes("GFS") && + componentSource.includes("ICON-EU") && componentSource.includes("JMA") && - componentSource.includes("AMOS") && - componentSource.includes("MGM") && - componentSource.includes("CWA") && - componentSource.includes("NOAA MADIS") && - componentSource.includes("truncated forecast curves") && - componentSource.includes("first-load chart loading"), - "terminal announcement should summarize the live-observation architecture update and recent chart fixes in English", + componentSource.includes("AROME HD") && + componentSource.includes("HRRR") && + componentSource.includes("NAM") && + componentSource.includes("Model median") && + componentSource.includes("spread") && + componentSource.includes("Only DEB") && + componentSource.includes("Large spread"), + "terminal announcement should summarize the model summary table release in English", ); assert( !middlewareSource.includes("/api/system/update-announcement"),