/* 工作流详情页共享上下文(detail ctx) * * workflowDetail.js 拆分后,各 detail 子模块需要访问当前工作流名、AbortController、 * 最新统计、进度曲线、点表过滤、Parallel Sets 状态等共享可变状态。这些原本是 * workflowDetail.js 顶部的 15+ 个模块级 let(跨工作流切换须手动逐字段 reset, * 是历史遗留的泄漏/残留 bug 源头),现收敛到本模块: * * 生命周期:mount 时 createDetailCtx(name) 新建 → 子模块经参数读写 ctx → * unmount 后整体丢弃(含 abort 在途请求)。 * * 子模块以 ctx 为第一参数接收,直接读写字段(vanilla JS 下的务实选择—— * 避免 getter/setter 样板;这些字段本就属于同一挂载作用域)。 */ /** * 创建详情页上下文。 * @param {string} name 工作流名 */ export function createDetailCtx(name) { return { name, // 本轮作用域轮询的 AbortController(unmount / 换工作流时 abort 在途请求) abortCtl: new AbortController(), // ===== Tab1 执行概览 ===== activeTab: 'overview', // 阶段视图切换('tlusty' 大气 / 'synspec' 光谱):概览分段进度条/指标卡 + parSets 状态轴共用。 // 切换按钮在详情页顶部 strip,默认 TLUSTY 视图。 phaseView: 'tlusty', latestStats: null, overviewBuilt: false, // 概览骨架仅首次构建,其后轮询原位 diff lastWavesSig: null, lastActivitySig: null, knownActivityKeys: new Set(), // 已在 feed 中的条目指纹(点名|完成时间) // 进度曲线(30s 节流拉取,DOM 跨轮询保留) lastProgressAt: 0, lastProgress: null, sparkBuilt: false, lastSparkSig: null, sparkHoverCtx: null, // 悬停上下文:mousemove 读取、数据刷新时写入 sparkKbIdx: -1, // 键盘十字线索引(-1=无) // ===== Tab2 网格点明细 ===== pointsBuilt: false, pointsFilter: { status: '', method: '', wave: '', q: '', sort: 'wave', order: 'asc', limit: 100, offset: 0 }, // ===== Tab3 收敛性分析(Parallel Sets 平行集合图) ===== psBuilt: false, psState: { points: [], hover: null, layout: null, dimX: null, segY: null, ts: null }, // ts: 数据快照时间(epoch ms) // ===== 浮层单例(unmount 时清理) ===== psTooltipEl: null, psPointListEl: null, pointPanelEl: null, }; }