From 866fac4518acb7943a2ae3761156fef00a9589ff Mon Sep 17 00:00:00 2001 From: chumingjun <15951837502@163.com> Date: Wed, 2 Sep 2026 23:33:30 +0800 Subject: [PATCH] =?UTF-8?q?feat(web):=20=E8=BF=90=E8=A1=8C=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E9=BB=98=E8=AE=A4=E6=BF=80=E6=B4=BB=E3=80=8C=E8=BF=87?= =?UTF-8?q?=E7=A8=8B=E3=80=8Dtab?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #119 - RESULT_TABS 顺序调整为「过程 / 成果 / 问题」,与默认激活项对齐 (该重排原在工作区未提交改动中,与本 issue 目标一致,一并收编) - ResultPanel 初始 useState 与切换运行的重置 effect 改为 'process' - deriveRunViewState 默认参数与非法 tab fallback 同步改为 'process' - result-adapter 测试断言同步更新 验证:web 14 套测试全绿;build-web.sh 双构建通过 --- web/src/ResultPanel.jsx | 4 ++-- web/src/result-adapter.test.mjs | 2 +- web/src/run-view-state.js | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/web/src/ResultPanel.jsx b/web/src/ResultPanel.jsx index ba0d5d9..75bdb75 100644 --- a/web/src/ResultPanel.jsx +++ b/web/src/ResultPanel.jsx @@ -159,7 +159,7 @@ export function ResultPanel({ className = '', }) { const runId = getRunId(runDetail, status, results); - const [activeTab, setActiveTab] = useState('result'); + const [activeTab, setActiveTab] = useState('process'); const [remoteResults, setRemoteResults] = useState(undefined); const [selectedOutputId, setSelectedOutputId] = useState(null); const [loading, setLoading] = useState(false); @@ -194,7 +194,7 @@ export function ResultPanel({ useEffect(() => { setRemoteResults(undefined); setSelectedOutputId(null); - setActiveTab('result'); + setActiveTab('process'); setSaveError(''); setSavedNames([]); }, [runId, results]); diff --git a/web/src/result-adapter.test.mjs b/web/src/result-adapter.test.mjs index 869c851..1a43e4f 100644 --- a/web/src/result-adapter.test.mjs +++ b/web/src/result-adapter.test.mjs @@ -196,7 +196,7 @@ assert.equal(artifactPreviewKind('archive.zip'), null); assert.equal(artifactPreviewKind('unsafe.svg'), null); const state = deriveRunViewState(fallback, 'bad-tab'); -assert.equal(state.activeTab, 'result'); +assert.equal(state.activeTab, 'process'); assert.deepEqual(state.counts, { result: 2, process: 3, issues: 0 }); assert.equal(state.canExport, true); assert.equal(state.isEmpty, false); diff --git a/web/src/run-view-state.js b/web/src/run-view-state.js index fb6d75c..88fa345 100644 --- a/web/src/run-view-state.js +++ b/web/src/run-view-state.js @@ -1,6 +1,6 @@ export const RESULT_TABS = Object.freeze([ - { id: 'result', label: '成果' }, { id: 'process', label: '过程' }, + { id: 'result', label: '成果' }, { id: 'issues', label: '问题' }, ]); @@ -19,7 +19,7 @@ export function getRunStatusMeta(status) { return STATUS_META[status] || { label: status || '未知状态', tone: 'neutral' }; } -export function deriveRunViewState(model, activeTab = 'result') { +export function deriveRunViewState(model, activeTab = 'process') { const safe = model || {}; const successfulOutputs = (safe.outputResults || []).filter((row) => row.status === 'success' && row.output); const counts = { @@ -27,7 +27,7 @@ export function deriveRunViewState(model, activeTab = 'result') { process: safe.nodeTimeline?.length || 0, issues: safe.issues?.length || 0, }; - const normalizedTab = RESULT_TABS.some((tab) => tab.id === activeTab) ? activeTab : 'result'; + const normalizedTab = RESULT_TABS.some((tab) => tab.id === activeTab) ? activeTab : 'process'; return { activeTab: normalizedTab, counts,