diff --git a/vehicle-data-platform/apps/web/src/v2/pages/HistoryPage.test.tsx b/vehicle-data-platform/apps/web/src/v2/pages/HistoryPage.test.tsx index 0ec073eb..6b4d1108 100644 --- a/vehicle-data-platform/apps/web/src/v2/pages/HistoryPage.test.tsx +++ b/vehicle-data-platform/apps/web/src/v2/pages/HistoryPage.test.tsx @@ -110,13 +110,15 @@ test('clears stale rows, charts, and evidence as soon as the history scope chang const view = renderPage(); expect((await screen.findAllByText('旧车牌')).length).toBeGreaterThan(0); expect(screen.queryByText('OLDVIN-evidence')).not.toBeInTheDocument(); - for (const className of ['v2-history-filter-card', 'v2-history-metrics-card', 'v2-history-summary', 'v2-history-trend', 'v2-history-table-card']) { + for (const className of ['v2-history-filter-card', 'v2-history-context-card', 'v2-history-table-card']) { expect(view.container.querySelector(`.${className}.semi-card`)).toBeInTheDocument(); } + expect(view.container.querySelector('.v2-history-context .v2-history-metrics')).toBeInTheDocument(); + expect(view.container.querySelector('.v2-history-context .v2-history-summary')).toBeInTheDocument(); expect(view.container.querySelector('.v2-history-evidence')).not.toBeInTheDocument(); expect(view.container.querySelector('.v2-history-workspace')).not.toHaveClass('is-inspector-open'); - expect(screen.getByRole('heading', { level: 5, name: '聚合趋势' })).toBeInTheDocument(); - expect(view.container.querySelector('.v2-history-trend')).toHaveClass('is-collapsed'); + expect(screen.queryByRole('heading', { level: 5, name: '聚合趋势' })).not.toBeInTheDocument(); + expect(view.container.querySelector('.v2-history-trend')).not.toBeInTheDocument(); expect(screen.getByRole('button', { name: /展开趋势/ })).toHaveAttribute('aria-expanded', 'false'); expect(screen.queryByRole('heading', { level: 5, name: '导出任务' })).not.toBeInTheDocument(); expect(view.container.querySelector('.v2-history-data-table.semi-table-wrapper')).toBeInTheDocument(); @@ -139,6 +141,8 @@ test('clears stale rows, charts, and evidence as soon as the history scope chang expect(desktopHistoryRow).toHaveAttribute('aria-expanded', 'true'); fireEvent.click(screen.getByRole('button', { name: /展开趋势/ })); await waitFor(() => expect(mocks.historySeries).toHaveBeenCalledTimes(1)); + expect(screen.getByRole('heading', { level: 5, name: '聚合趋势' })).toBeInTheDocument(); + expect(view.container.querySelector('.v2-history-trend')).toHaveClass('is-expanded'); fireEvent.change(screen.getByPlaceholderText('车牌 / VIN,多台用逗号分隔'), { target: { value: 'NEWVIN' } }); fireEvent.click(screen.getByRole('button', { name: '查询' })); diff --git a/vehicle-data-platform/apps/web/src/v2/pages/HistoryPage.tsx b/vehicle-data-platform/apps/web/src/v2/pages/HistoryPage.tsx index a77f4e93..30918ddd 100644 --- a/vehicle-data-platform/apps/web/src/v2/pages/HistoryPage.tsx +++ b/vehicle-data-platform/apps/web/src/v2/pages/HistoryPage.tsx @@ -9,7 +9,6 @@ import { buildHistorySeriesPanels, formatExportFileSize, formatHistoryValue, for import { downloadBlob } from '../domain/download'; import { InlineError, PanelEmpty, PanelLoading } from '../shared/AsyncState'; import { MonitorReturnBar } from '../shared/MonitorReturnBar'; -import { PageHeader } from '../shared/PageHeader'; import { TablePagination } from '../shared/TablePagination'; import { WorkspaceFilterPanel } from '../shared/WorkspaceFilterPanel'; import { WorkspacePanelHeader } from '../shared/WorkspacePanelHeader'; @@ -57,18 +56,18 @@ function HistoryTrend({ response, category, loading, error, hasMetrics, expanded const header = } - aria-expanded={expanded} + aria-expanded="true" onClick={onToggle} - >{expanded ? '收起趋势' : '展开趋势'}} + >收起趋势} />; - if (!expanded) return {header}; + if (!expanded) return null; if (category !== 'location') return {header}; if (!hasMetrics) return {header}; return {header} @@ -331,12 +330,6 @@ export default function HistoryPage() { return
- {keywords.length ? `${keywords.length} 辆车辆` : '等待选择车辆'}} - /> {exportAllowed ? : 只读}
- -
- 已选字段 -
- {visibleMetrics.map((metric) => toggleMetric(metric.key)} onKeyDown={(event) => { if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); toggleMetric(metric.key); } }} onClose={(_, event) => { event.stopPropagation(); toggleMetric(metric.key); }} key={metric.key}>{metric.label}{metric.unit ? ` (${metric.unit})` : ''})} - {allMetrics.length > visibleMetrics.length ? 另有 {allMetrics.length - visibleMetrics.length} 项可选 : !allMetrics.length ? 查询后加载可用指标 : null} + +
+
+
+ 显示字段 + {visibleMetrics.length} / {allMetrics.length} +
+
+ {visibleMetrics.map((metric) => toggleMetric(metric.key)} onKeyDown={(event) => { if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); toggleMetric(metric.key); } }} onClose={(_, event) => { event.stopPropagation(); toggleMetric(metric.key); }} key={metric.key}>{metric.label}{metric.unit ? ` (${metric.unit})` : ''})} + {allMetrics.length > visibleMetrics.length ? 另有 {allMetrics.length - visibleMetrics.length} 项可选 : !allMetrics.length ? 查询后加载可用指标 : null} +
+ +
+
+
结果行数{result?.total?.toLocaleString('zh-CN') ?? '—'}
+
车辆数{resultSummary?.vehicleCount ?? '—'}
+
数据源{summarySources}
+
查询耗时{resultSummary ? `${resultSummary.queryDurationMs} ms` : '—'}
-
{dataQuery.isError ? dataQuery.refetch()} /> : null}
-
结果行数{result?.total?.toLocaleString('zh-CN') ?? '—'}
车辆数{resultSummary?.vehicleCount ?? '—'}
数据源{summarySources}
查询耗时{resultSummary ? `${resultSummary.queryDurationMs} ms` : '—'}
setTrendExpanded((value) => !value)} /> - {exportAllowed ? : null}{!mobileLayout ? setDensity(String(value) as typeof density)} optionList={[{ value: 'compact', label: '紧凑' }, { value: 'comfortable', label: '舒适' }]} /> : null} +