Skip to content

feat(kline): 弹窗切股导航 + 邻股预取 + 悬停「至今」+ 外部链接 - #210

Open
thinkbuf wants to merge 11 commits into
shy3130:mainfrom
thinkbuf:feat/kline-preview-nav
Open

feat(kline): 弹窗切股导航 + 邻股预取 + 悬停「至今」+ 外部链接#210
thinkbuf wants to merge 11 commits into
shy3130:mainfrom
thinkbuf:feat/kline-preview-nav

Conversation

@thinkbuf

Copy link
Copy Markdown

对「K线弹窗」(StockPreviewDialog) 的一组增强,移植自 fork 侧积累的实现,适配到当前上游代码。

功能

弹窗内切股导航

  • 顶栏 ◀ n/N ▶ 按钮 + ←/→ 方向键在来源榜单内循环切股,首↔尾循环弱提示
  • 来源页(自选/监控/选股器/概念/行业/看板/连板/成分)构建 navList 并高亮当前预览行
  • 导航列表按 symbol 去重,避免多概念/行业 leader 重复导致计数空跳

邻股预取 + 稳定高度

  • 切股导航的左右邻股预取日K/财务/分时缓存,切换瞬间免 loading
  • 新建 lib/kline.tsklineDailyQueryOptions / klineMinuteQueryOptions / klineMinuteRangeQueryOptions 单源工厂
  • 日K视图旁的分时图与分时 tab 的多日分时一并预取
  • 信息条加载态按字段配置预留行高,切股时弹窗高度不抖动

悬停显示「至今/周期N」

  • 悬停某根K线时,图表信息栏显示从该K线昨收到最新收盘的涨跌幅与K线根数,移出隐藏

可配置外部股票链接

  • 设置页「个股详情外链」可填 URL 模板({code}/{market}/{symbol}),信息条显示外链图标(新标签打开)

配套修复

  • 弹窗加宽(max-w 1200),日K/分时并排 1.4:1(仅弹窗场景),信息栏单行容纳「至今/周期」
  • 分时 tab 下切股保留视图(不跳回日K)
  • 切股后 blur 清除控件残留的浏览器默认 focus 环

未包含

  • 信息条展示自选标签(tags):依赖上游没有的 watchlist-tags 功能,若需要可单独提 PR

验证

  • pnpm --dir frontend build(tsc -b && vite build)通过

🤖 Generated with Claude Code

thinkbuf and others added 11 commits August 27, 2026 10:07
K线弹窗支持在来源榜单内切股: 顶栏 ◀ n/N ▶ 按钮 + ←/→ 方向键(输入框/编辑器内让位),
首↔尾循环弱提示, 并给来源页当前预览行加高亮。

- StockPreviewDialog: 新增 navList/onNavigate props, 导出 NavItem/toNavItems;
  合并 ESC 与方向键监听; wrapMsg 弱提示浮层
- 9 个来源页面(自选/监控/选股/概念/行业/看板/连板/成分)构建 navList 并传 activeSymbol

Co-Authored-By: Claude <noreply@anthropic.com>
同一标的在榜单中多次出现(多概念/行业 leader、监控重复触发)时,
去重后保留首次出现, 避免切股与 n/N 计数空跳。

Co-Authored-By: Claude <noreply@anthropic.com>
切股瞬间免 loading + 弹窗高度不抖动。

- 新建 lib/kline.ts: klineDailyQueryOptions 作为日K查询唯一权威配置,
  StockPanel(信息条)/StockDailyKChart(图表)/邻近预取三处共享同一 cache key
- StockPanel: 日K查询上提并新增 prefetchSymbols prop, 预取左右邻股日K+财务,
  日K到货后级联预取其默认选中日分时(klineMinute) —— 日K视图并排展示的分时图也免 loading
- StockInfoBar: 无数据时保持挂载(加载态占位), 按字段配置预留行高, 高度不塌陷
- useFinancials: 抽出 financialMetricsQueryOptions 供 prefetch 复用
- StockDailyKChart: 查询改走共享 options, 移除 onDataChange 上报链路

Co-Authored-By: Claude <noreply@anthropic.com>
悬停某根K线时, 图表自带信息栏额外显示「至今」(该K线昨收到最新收盘的涨跌幅)
与「周期 N」(到最新K线共多少根); 鼠标移出图表区仅隐藏该字段, 其余保持。

- updateAxisPointer 重写: 区分 悬停K线变化 与 竖虚线显隐, 分别控制信息栏重绘与副图 graphic
- 信息栏行高 height → min-height, 容纳「至今」字段不被裁剪

Co-Authored-By: Claude <noreply@anthropic.com>
设置页新增「个股详情外链」: 可填 URL 模板(占位符 {code}/{market}/{symbol}),
信息条第一行右侧显示外链图标(新标签打开)。留空关闭。

- 新建 lib/stock-external-link.ts: load/save/build + scheme 白名单(http/https) + symbol 形状守卫
- storage.ts 新增 stockExternalTemplate kv

Co-Authored-By: Claude <noreply@anthropic.com>
… and nav lists

审查后清理, 无行为变更:

- lib/kline.ts: 新增 klineMinuteQueryOptions, StockIntradayChart/StockMultiDayIntradayChart/
  StockPanel 邻股预取共用 (与 klineDailyQueryOptions 同风格单源)
- LimitUpLadder: sortLadderStocks 每 tick 只跑一次 (sortedTiers memo 供 TierGroup 与
  ladderNavItems 共用), resolveExtFields 提升为 memo (原来算 4 次)
- Dashboard: rankNav 复用 toNavItems 去掉 ! 断言; onNavigate 死条件简化为 alert: undefined
- Screener: 消费 ScreenerTable 传入的 navList (成员弹窗导航不再被丢弃), 移除重复 memo
- Watchlist: nav 列表仅在弹窗打开时构建 (sortedRows 随行情 tick 重建)
- ConceptAnalysis/IndustryAnalysis: 重复的 onStockClick 内联 lambda 抽为 handleStockClick
- StockPreviewDialog: 方向键与 ESC 同层级守卫 priceAlertDraft (点位弹窗打开时不切股)
- StockPanel: 去掉冗余 tick 别名; Monitor: 去掉冗余 as NavItem 断言

Co-Authored-By: Claude <noreply@anthropic.com>
…switching

- 弹窗 max-w 1100→1200, 日K/分时并排改 1.4:1 (日K为主视图),
  图表信息栏(悬停含「至今/周期」)有足够宽度单行容纳, 不再换行
- 修复: 分时 tab 下弹窗内切股会跳回日K —
  视图重置仅在弹窗首次打开(symbol 从 null 变非空)时发生, 切股保留当前视图

Co-Authored-By: Claude <noreply@anthropic.com>
…tab instant

之前邻股只预取了日K/财务/单日分时(日K视图旁的分时图), 分时 tab 用的
多日分时(klineMinuteRange)没预取 → 分时 tab 切股仍要重新加载。

- lib/kline.ts: 新增 klineMinuteRangeQueryOptions, StockMultiDayIntradayChart 与预取共用
- StockPanel: 新增 intradayDays prop, 邻股预取补充 klineMinuteRange(days) + 最新分时
- StockPreviewDialog: 把当前 intradayDays 传给两个分支的 StockPanel, 保证 queryKey 命中

Co-Authored-By: Claude <noreply@anthropic.com>
…ray focus ring

点过分时tab/外链等控件后方向键切股, 浏览器会给该已聚焦控件显示
focus-visible 默认蓝色 outline(应用未自定义 focus 样式, 即浏览器默认环)。
切股成功后 blur 掉当前聚焦元素, 一次覆盖弹窗内所有控件。

Co-Authored-By: Claude <noreply@anthropic.com>
…uard and default

审查后清理, 无行为变更 (除下述作用域修正):

- StockPanel: 日K/分时并排的占宽从硬编码 flex-[1.4] 改为 dailyKlineFlex prop
  (默认 flex-1) —— 避免静默改变 TradeKlineModal 等其他消费方的并排布局;
  仅 StockPreviewDialog 显式传入 flex-[1.4]
- lib/kline.ts: klineMinuteRangeQueryOptions 内嵌「仅同 symbol」placeholderData 守卫,
  与 klineDailyQueryOptions 同源, 删除 StockMultiDayIntradayChart 的内联副本
- DEFAULT_INTRADAY_DAYS 单源化: StockPanel 默认值与弹窗 loadIntradayDays 回退共用
- StockPreviewDialog: prevSymbolRef 初始值改 null (首次挂载 view 本就是 daily);
  blur 复用 keydown 的 e.target(t) 替代重复 document.activeElement 查询

Co-Authored-By: Claude <noreply@anthropic.com>
- EChartsCandlestick: 悬停重置 effect 依赖补上 symbol(_symbol) ——
  预取切股到同长度邻股时 data.length 不变, 原 [data.length] 不触发,
  hoverActiveRef 残留导致切股后「至今/周期」无悬停仍显示 (自愈于下次 mousemove)
- Watchlist: DimensionMembersDialog 的 onStockClick 补第三参 navList ——
  从成分弹窗打开个股时用成分列表作切股导航 (成员可能不在自选列表,
  原实现退回自选列表, 成员不在自选则导航按钮不显示)

Co-Authored-By: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant